~aleteoryx/muditaos

6c9ef5a20af584fe41daeb57821d269b3a78cbcc — Przemyslaw Brudny 4 years ago 2eff517 + 33f244b
Merge remote-tracking branch 'origin/stable'
62 files changed, 414 insertions(+), 181 deletions(-)

A art/phone/common/empty_list_add_W_G.png
M image/assets/images/empty_list_add_W_G.vpi
A image/assets/images/settings/empty_list_add_test_W_G_1.vpi
A image/assets/images/settings/empty_list_add_test_W_G_2.vpi
A image/assets/images/settings/empty_list_add_test_W_G_3.vpi
A image/assets/images/settings/empty_list_add_test_W_G_4.vpi
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 image/assets/lang/Svenska.json
M module-apps/application-settings/ApplicationSettings.cpp
M module-apps/application-settings/CMakeLists.txt
M module-apps/application-settings/windows/WindowNames.hpp
M module-apps/application-settings/windows/advanced/AdvancedOptionsWindow.cpp
A module-apps/application-settings/windows/advanced/TextImageColorWindow.cpp
A module-apps/application-settings/windows/advanced/TextImageColorWindow.hpp
M module-apps/apps-common/popups/WindowWithTimer.cpp
M module-apps/apps-common/popups/WindowWithTimer.hpp
M module-bsp/board/rt1051/bellpx/bsp/fuel_gauge/CW2015CHBD.hpp
M products/BellHybrid/BinaryAssetsVersions.cmake
M products/BellHybrid/CMakeLists.txt
M products/BellHybrid/apps/application-bell-background-sounds/windows/BGSoundsProgressWindow.cpp
M products/BellHybrid/apps/application-bell-main/presenters/StateController.cpp
M products/BellHybrid/apps/application-bell-main/presenters/StateController.hpp
M products/BellHybrid/apps/application-bell-main/widgets/BellBattery.hpp
M products/BellHybrid/apps/application-bell-main/windows/BellHomeScreenWindow.cpp
M products/BellHybrid/apps/application-bell-meditation-timer/data/MeditationStyle.hpp
M products/BellHybrid/apps/application-bell-meditation-timer/presenter/MeditationProgressPresenter.cpp
M products/BellHybrid/apps/application-bell-meditation-timer/presenter/MeditationProgressPresenter.hpp
M products/BellHybrid/apps/application-bell-meditation-timer/windows/MeditationRunningWindow.cpp
M products/BellHybrid/apps/application-bell-onboarding/ApplicationBellOnBoarding.cpp
M products/BellHybrid/apps/application-bell-onboarding/presenter/OnBoardingLanguageWindowPresenter.cpp
M products/BellHybrid/apps/application-bell-onboarding/presenter/OnBoardingLanguageWindowPresenter.hpp
M products/BellHybrid/apps/application-bell-powernap/data/PowerNapListItem.cpp
M products/BellHybrid/apps/application-bell-powernap/data/PowerNapStyle.hpp
M products/BellHybrid/apps/application-bell-powernap/presenter/PowerNapProgressPresenter.cpp
M products/BellHybrid/apps/application-bell-powernap/presenter/PowerNapProgressPresenter.hpp
M products/BellHybrid/apps/application-bell-powernap/windows/PowerNapProgressWindow.cpp
M products/BellHybrid/apps/application-bell-powernap/windows/PowerNapProgressWindow.hpp
M products/BellHybrid/apps/application-bell-settings/models/advanced/AboutYourBellModel.cpp
M products/BellHybrid/apps/application-bell-settings/models/alarm_settings/SnoozeListItemProvider.cpp
M products/BellHybrid/apps/application-bell-settings/presenter/advanced/LanguageWindowPresenter.cpp
M products/BellHybrid/apps/application-bell-settings/presenter/advanced/LanguageWindowPresenter.hpp
M products/BellHybrid/apps/application-bell-settings/widgets/advanced/AboutYourBellListItem.cpp
M products/BellHybrid/apps/application-bell-settings/windows/advanced/AboutYourBellWindow.cpp
M products/BellHybrid/apps/application-bell-settings/windows/advanced/AboutYourBellWindow.hpp
M products/BellHybrid/apps/common/CMakeLists.txt
A products/BellHybrid/apps/common/include/common/LanguageUtils.hpp
A products/BellHybrid/apps/common/include/common/Languages.hpp
M products/BellHybrid/apps/common/include/common/widgets/ListItems.hpp
A products/BellHybrid/apps/common/src/LanguageUtils.cpp
M products/BellHybrid/apps/common/src/TimeUtils.cpp
M products/BellHybrid/apps/common/src/widgets/ListItems.cpp
M products/BellHybrid/apps/common/src/windows/BellWelcomeWindow.cpp
M products/BellHybrid/config/ProductConfig.in.hpp
M products/BellHybrid/services/appmgr/include/appmgr/IdleHandler.hpp
M products/BellHybrid/services/time/AlarmOperations.cpp
M products/PurePhone/config.cmake
M third-party/usb_stack
M tools/generate_update_image.sh
A art/phone/common/empty_list_add_W_G.png => art/phone/common/empty_list_add_W_G.png +0 -0
M image/assets/images/empty_list_add_W_G.vpi => image/assets/images/empty_list_add_W_G.vpi +0 -0
A image/assets/images/settings/empty_list_add_test_W_G_1.vpi => image/assets/images/settings/empty_list_add_test_W_G_1.vpi +0 -0
A image/assets/images/settings/empty_list_add_test_W_G_2.vpi => image/assets/images/settings/empty_list_add_test_W_G_2.vpi +0 -0
A image/assets/images/settings/empty_list_add_test_W_G_3.vpi => image/assets/images/settings/empty_list_add_test_W_G_3.vpi +0 -0
A image/assets/images/settings/empty_list_add_test_W_G_4.vpi => image/assets/images/settings/empty_list_add_test_W_G_4.vpi +0 -0
M image/assets/lang/Deutsch.json => image/assets/lang/Deutsch.json +12 -12
@@ 103,7 103,7 @@
  "app_alarm_clock_repeat_everyday": "Täglich",
  "app_alarm_clock_repeat_week_days": "Wochentags",
  "app_alarm_clock_repeat_custom": "Benutzerdefiniert",
  "app_alarm_clock_no_alarms_information": "<text align='center' color='5'>Noch kein Alarm.<p>Zum Hinzufügen <b>linken Pfeil</b> drücken.</p></text>",
  "app_alarm_clock_no_alarms_information": "<text align='center' color='4'>Noch kein Alarm.<p>Zum Hinzufügen <b>linken Pfeil</b> drücken.</p></text>",
  "app_alarm_clock_options_edit": "Ändern",
  "app_alarm_clock_options_delete": "Löschen",
  "app_alarm_clock_options_turn_off_all_alarms": "Alle Alarme ausschalten",


@@ 170,7 170,7 @@
  "app_notes_edited": "Geändert",
  "app_notes_delete_note": "Löschen",
  "app_notes_note_delete_confirmation": "Diese Notiz wirklich löschen?",
  "app_notes_no_notes": "<text align='center' color='5'>Noch keine Notiz.<p>Zum Hinzufügen <b>linken Pfeil</b> drücken.</p></text>",
  "app_notes_no_notes": "<text align='center' color='4'>Noch keine Notiz.<p>Zum Hinzufügen <b>linken Pfeil</b> drücken.</p></text>",
  "app_notes_search_no_results": "Keine Notizen gefunden.",
  "app_calllog_title_main": "Anrufe",
  "app_calllog_type": "Anruf",


@@ 192,7 192,6 @@
  "app_music_player_music_library_window_name": "Musikbibliothek",
  "app_music_player_empty_track_notification": "Bitte wählen Sie einen Song aus der Bibliothek",
  "app_music_player_start_window_notification": "<text color='5'>Drücken Sie <b>nach unten</b>, um<br></br>einen Song auszuwählen</text>",
  "app_calllog_no_calls": "Noch keine Anrufe.",
  "app_desktop_unlock": "ENTSPERREN",
  "app_desktop_menu": "MENÜ",
  "app_desktop_emergency": "NOTRUF",


@@ 319,7 318,7 @@
  "app_call_emergency_text": "Notruf",
  "app_call_wrong_emergency": "Anruf nicht möglich.\n$NUMBER ist keine Notrufnummer.",
  "app_messages_title_main": "Nachrichten",
  "app_messages_no_messages": "<text align='center' color='5'>Noch keine Nachrichten.<p>Zum Hinzufügen <b>linken Pfeil</b> drücken.</p></text>",
  "app_messages_no_messages": "<text align='center' color='4'>Noch keine Nachrichten.<p>Zum Hinzufügen <b>linken Pfeil</b> drücken.</p></text>",
  "app_messages_thread_delete_confirmation": "Dieses Gespräch löschen?",
  "app_messages_message_delete_confirmation": "<text align='center'><p>Diese Nachricht wirklich <text weight='bold'>löschen</text></p>?</text>",
  "app_messages_thread_no_result": "Keine Ergebnisse",


@@ 611,11 610,12 @@
  "app_bellmain_home_screen_bottom_desc_dp": "Tief drücken, um zu aktivieren",
  "app_bellmain_home_screen_bottom_desc": "Der nächste Alarm klingelt",
  "app_bellmain_home_screen_bottom_desc_in": "in",
  "app_bellmain_home_screen_bottom_desc_and": "&",
  "app_bell_alarm_deactivated": "Alarm deaktiviert",
  "app_bellmain_alarm": "Alarm",
  "app_bellmain_power_nap": "Kraft-Schläfchen",
  "app_bellmain_meditation_timer": "Meditation-Timer",
  "app_bellmain_background_sounds": "Klangbibliothek",
  "app_bellmain_meditation_timer": "Meditation",
  "app_bellmain_background_sounds": "Entspannung",
  "app_bellmain_bedtime": "Schlafenzeit",
  "app_bellmain_settings": "Einstellungen",
  "app_bell_bedtime_notification": "Schlafenszeit",


@@ 638,7 638,7 @@
  "app_bell_settings_turn_off": "Ausschalten",
  "app_bell_settings_time_units": "Zeit und Einheiten",
  "app_bell_settings_advanced_language": "Sprache",
  "app_bell_settings_advanced_about": "Über",
  "app_bell_settings_advanced_about": "Information",
  "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",


@@ 668,13 668,13 @@
  "app_bell_settings_frontlight_mode_on_demand": "manuell",
  "app_bell_settings_frontlight_top_message": "Lichtstärke des Frontlichts",
  "app_bell_greeting_msg": "Guten Morgen! Stehen Sie auf",
  "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_settings_advanced_factory_reset": "Zurücksetzen",
  "app_bell_settings_display_factory_reset_confirmation": "Zurücksetzen?",
  "app_bell_meditation_timer": "Meditation",
  "app_bell_meditation_interval_chime": "Intervallschall",
  "app_bell_meditation_progress": "Meditation-Timer",
  "app_bell_meditation_progress": "Meditation",
  "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>"
}
}
\ No newline at end of file

M image/assets/lang/English.json => image/assets/lang/English.json +6 -5
@@ 110,7 110,7 @@
  "app_alarm_clock_repeat_everyday": "Everyday",
  "app_alarm_clock_repeat_week_days": "Weekdays",
  "app_alarm_clock_repeat_custom": "Custom",
  "app_alarm_clock_no_alarms_information": "<text align='center' color='5'>No alarms yet.<p>Press <b>left arrow</b> to add new.</p></text>",
  "app_alarm_clock_no_alarms_information": "<text align='center' color='4'>No alarms yet.<p>Press <b>left arrow</b> to add new.</p></text>",
  "app_alarm_clock_options_edit": "Edit",
  "app_alarm_clock_options_delete": "Delete",
  "app_alarm_clock_options_turn_off_all_alarms": "Turn off all alarms",


@@ 142,10 142,10 @@
  "app_notes_edited": "Edited",
  "app_notes_delete_note": "Delete",
  "app_notes_note_delete_confirmation": "Do you really want to delete this note?",
  "app_notes_no_notes": "<text align='center' color='5'>No notes yet.<p>Press <b>left arrow</b> to add new.</p></text>",
  "app_notes_no_notes": "<text align='center' color='4'>No notes yet.<p>Press <b>left arrow</b> to add new.</p></text>",
  "app_notes_search_no_results": "No notes found.",
  "app_calllog_title_main": "Calls",
  "app_calllog_no_calls": "<text align='center' color='5'>No calls yet.</text>",
  "app_calllog_no_calls": "<text align='center' color='4'>No calls yet.</text>",
  "app_calllog_type": "Call",
  "app_calllog_duration": "Duration",
  "app_calllog_incoming_call": "Incoming call",


@@ 288,7 288,7 @@
  "app_call_emergency_text": "Emergency call",
  "app_call_wrong_emergency": "Can't make a call.\n$NUMBER is not an emergency number.",
  "app_messages_title_main": "Messages",
  "app_messages_no_messages": "<text align='center' color='5'>No messages yet.<p>Press <b>left arrow</b> to add new.</p></text>",
  "app_messages_no_messages": "<text align='center' color='4'>No messages yet.<p>Press <b>left arrow</b> to add new.</p></text>",
  "app_messages_thread_delete_confirmation": "Delete this conversation?",
  "app_messages_message_delete_confirmation": "Delete this message?",
  "app_messages_thread_no_result": "There are no results",


@@ 487,7 487,7 @@
  "common_search_uc": "Search",
  "common_search_results": "Search results",
  "app_phonebook_search_no_results": "No contacts found.",
  "app_phonebook_no_contacts": "<text align='center' color='5'>No contacts yet.<p>Press <b>left arrow</b> to add new.</p></text>",
  "app_phonebook_no_contacts": "<text align='center' color='4'>No contacts yet.<p>Press <b>left arrow</b> to add new.</p></text>",
  "app_phonebook_contact_title": "Add contact",
  "app_phonebook_contact_no_name": "no name",
  "app_phonebook_contact_information": "Information",


@@ 642,6 642,7 @@
  "app_bell_settings_alarm_settings_snooze_chime_volume": "Snooze chime volume",
  "app_bellmain_home_screen_bottom_desc": "Next alarm will ring",
  "app_bellmain_home_screen_bottom_desc_in": "in",
  "app_bellmain_home_screen_bottom_desc_and": "&",
  "app_bellmain_home_screen_bottom_desc_less_than": "less than",
  "app_bellmain_home_screen_bottom_desc_dp": "Deep press to activate",
  "app_bell_alarm_deactivated": "<text>Alarm deactivated</text>",

M image/assets/lang/Espanol.json => image/assets/lang/Espanol.json +14 -13
@@ 103,7 103,7 @@
  "app_alarm_clock_repeat_everyday": "Todos los días",
  "app_alarm_clock_repeat_week_days": "Días laborables",
  "app_alarm_clock_repeat_custom": "Personalizado",
  "app_alarm_clock_no_alarms_information": "<text align='center' color='5'>No hay alarmas.<p>Pulsa la <b>flecha izquierda</b> para añadir una.</p></text>",
  "app_alarm_clock_no_alarms_information": "<text align='center' color='4'>No hay alarmas.<p>Pulsa la <b>flecha izquierda</b> para añadir una.</p></text>",
  "app_alarm_clock_options_edit": "Editar",
  "app_alarm_clock_options_delete": "Eliminar",
  "app_alarm_clock_options_turn_off_all_alarms": "Apagar todas las alarmas",


@@ 170,7 170,7 @@
  "app_notes_edited": "Editado",
  "app_notes_delete_note": "Eliminar",
  "app_notes_note_delete_confirmation": "¿Seguro que quieres eliminar esta nota?",
  "app_notes_no_notes": "<text align='center' color='5'>No hay notas.<p>Pulsa la <b>flecha izquierda</b> para añadir una.</p></text>",
  "app_notes_no_notes": "<text align='center' color='4'>No hay notas.<p>Pulsa la <b>flecha izquierda</b> para añadir una.</p></text>",
  "app_notes_search_no_results": "No se encontraron notas.",
  "app_calllog_title_main": "Llamadas",
  "app_calllog_type": "Llamada",


@@ 318,7 318,7 @@
  "app_call_emergency_text": "Llamada de emergencia",
  "app_call_wrong_emergency": "No es posible realizar la llamada.\n$NUMBER no es un número de emergencias.",
  "app_messages_title_main": "Mensajes",
  "app_messages_no_messages": "<text align='center' color='5'>No hay mensajes.<p>Pulsa la <b>flecha izquierda</b> para añadir uno.</p></text>",
  "app_messages_no_messages": "<text align='center' color='4'>No hay mensajes.<p>Pulsa la <b>flecha izquierda</b> para añadir uno.</p></text>",
  "app_messages_thread_delete_confirmation": "¿Eliminar esta conversación?",
  "app_messages_message_delete_confirmation": "<text align='center'><p>¿Seguro que quieres <text weight='bold'>eliminar</text></p> este mensaje?</text>",
  "app_messages_thread_no_result": "No hay resultados",


@@ 603,6 603,7 @@
  "tethering_menu_access_decline": "<text>El anclaje de red está activado.<br /><br />Para acceder al menú,<br />desactiva el tethering.</text>",
  "app_bellmain_home_screen_bottom_desc": "La siguiente alarma sonará",
  "app_bellmain_home_screen_bottom_desc_in": "en",
  "app_bellmain_home_screen_bottom_desc_and": "&",
  "app_bell_alarm_deactivated": "Alarma desactivada",
  "app_bell_turn_off_question": "¿Apagar Mudita Harmony?",
  "app_bell_goodbye": "Adiós",


@@ 612,15 613,15 @@
  "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_light_click": "<text font='gt_pressura' weight='regular' size='38'>Click 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'>muy profundo</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_bell_onboarding_welcome": "Bienvenido",
  "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": "Meditación",
  "app_bellmain_background_sounds": "Sonidos de fondo",
  "app_bellmain_background_sounds": "Relajación",
  "app_bellmain_bedtime": "Hora de dormir",
  "app_bellmain_settings": "Ajustes",
  "app_bell_bedtime_notification": "Es tu hora de dormir",


@@ 656,10 657,10 @@
  "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_snooze": "Posponer",
  "app_bell_settings_alarm_settings_snooze": "Repetición",
  "app_bell_settings_alarm_settings_snooze_length": "Duración de Repetición",
  "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_interval_bot_desc": "durante la función de repetición",
  "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",


@@ 668,12 669,12 @@
  "app_bell_settings_frontlight_top_message": "Intensidad de luz frontal",
  "app_bell_greeting_msg": "¡Hola! Levántate y brilla",
  "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_settings_display_factory_reset_confirmation": "<text>¿Restablecer la configuración?</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_chime": "Intervalo",
  "app_bell_meditation_progress": "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_put_down_and_wait": "<text>Posicione Mudita Harmony<br>y espere el gong</text>",
  "app_bell_meditation_thank_you_for_session": "<text>Gracias<br>por la sesión</text>"
}
}
\ No newline at end of file

M image/assets/lang/Francais.json => image/assets/lang/Francais.json +12 -11
@@ 107,7 107,7 @@
  "app_alarm_clock_repeat_everyday": "Tous les jours",
  "app_alarm_clock_repeat_week_days": "Jours de la semaine",
  "app_alarm_clock_repeat_custom": "Personnalisé",
  "app_alarm_clock_no_alarms_information": "<text align='center' color='5'>Aucune alarme pour le moment.<p> Appuyez sur la <b>flèche gauche</b> pour en ajouter une nouvelle.</p></text>",
  "app_alarm_clock_no_alarms_information": "<text align='center' color='4'>Aucune alarme pour le moment.<p> Appuyez sur la <b>flèche gauche</b> pour en ajouter une nouvelle.</p></text>",
  "app_alarm_clock_options_edit": "Modifier",
  "app_alarm_clock_options_delete": "Supprimer",
  "app_alarm_clock_options_turn_off_all_alarms": "Éteignez toutes les alarmes",


@@ 139,7 139,7 @@
  "app_notes_edited": "Modifiée",
  "app_notes_delete_note": "Supprimer",
  "app_notes_note_delete_confirmation": "Voulez-vous vraiment supprimer cette note?",
  "app_notes_no_notes": "<text align = 'center' color = '5'> Pas encore de notes.<p>Appuyez sur la <b>flèche gauche</b> pour en ajouter une nouvelle.</p></text>",
  "app_notes_no_notes": "<text align = 'center' color = '4'> Pas encore de notes.<p>Appuyez sur la <b>flèche gauche</b> pour en ajouter une nouvelle.</p></text>",
  "app_notes_search_no_results": "Aucune note trouvée.",
  "app_calllog_title_main": "Appels",
  "app_calllog_type": "Appel",


@@ 287,7 287,7 @@
  "app_call_emergency_text": "Appel d'urgence",
  "app_call_wrong_emergency": "Impossible de faire un appel.\n$NUMBER n'est pas un numéro d'urgence.",
  "app_messages_title_main": "Messages",
  "app_messages_no_messages": "<text align = 'center' color = '5'>Aucun message.<p>Appuyez sur la <b>flèche gauche</b> pour en composer un nouveau.</p></text>",
  "app_messages_no_messages": "<text align = 'center' color = '4'>Aucun message.<p>Appuyez sur la <b>flèche gauche</b> pour en composer un nouveau.</p></text>",
  "app_messages_thread_delete_confirmation": "Supprimer cette conversation ?",
  "app_messages_message_delete_confirmation": "<text align='center'><p>Do you really want to <text weight='bold'>delete</text></p>this message?</text>",
  "app_messages_thread_no_result": "Aucun résultat",


@@ 570,20 570,21 @@
  "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": "Méditation",
  "app_bellmain_media_library": "Media Library",
  "app_bellmain_media_library": "Relaxation",
  "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",
  "app_bellmain_home_screen_bottom_desc_in": "dans",
  "app_bellmain_home_screen_bottom_desc_and": "&",
  "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 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_finalize": "Bien!",
  "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>",


@@ 594,7 595,7 @@
  "app_bellmain_alarm": "Alarme",
  "app_bellmain_background_sounds": "Bruits de fond",
  "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_powernap_session_ended_message": "Re-bonjour!",
  "app_bell_background_sounds_timer_title": "Minuterie",
  "app_bell_background_sounds_timer_off": "OFF",
  "app_bell_settings_home_view": "Écran d'accueil",


@@ 609,7 610,7 @@
  "app_bell_settings_advanced_language": "Langue",
  "app_bell_settings_advanced_about": "À propos",
  "app_bell_settings_advanced_about_product": "Mudita Harmony",
  "app_bell_settings_advanced_about_version": "<text>Version du système d'exploitation: <token>$VERSION</token></text>",
  "app_bell_settings_advanced_about_version": "<text>Version du système: <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 certification",


@@ 622,7 623,7 @@
  "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_alarm_tone_and_light": "Mélodie et lumière de l’alarme",
  "app_bell_settings_alarm_settings_alarm_tone_and_light": "Alarme principale",
  "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",


@@ 636,14 637,14 @@
  "app_bell_settings_frontlight_mode_auto": "automatique",
  "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_greeting_msg": "Re-bonjour!",
  "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_progress": "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>"
}
}
\ No newline at end of file

M image/assets/lang/Polski.json => image/assets/lang/Polski.json +24 -23
@@ 75,6 75,7 @@
  "common_accept": "AKCEPTUJ",
  "common_minute_lower": "minuta",
  "common_minutes_lower": "minuty",
  "common_minutes_lower_genitive": "minut",
  "common_minute_short": "min",
  "common_paused": "Pauza",
  "common_text_copy": "Kopiuj tekst",


@@ 103,7 104,7 @@
  "app_alarm_clock_repeat_everyday": "Codziennie",
  "app_alarm_clock_repeat_week_days": "Dni powszednie",
  "app_alarm_clock_repeat_custom": "Własne",
  "app_alarm_clock_no_alarms_information": "<text align='center' color='5'>Nie ma jeszcze żadnego alarmu.<p>Wciśnij <b>lewą strzałkę</b>, by dodać nowy.</p></text>",
  "app_alarm_clock_no_alarms_information": "<text align='center' color='4'>Nie ma jeszcze żadnego alarmu.<p>Wciśnij <b>lewą strzałkę</b>, by dodać nowy.</p></text>",
  "app_alarm_clock_options_edit": "Edytuj",
  "app_alarm_clock_options_delete": "Usuń",
  "app_alarm_clock_options_turn_off_all_alarms": "Wyłącz wszystkie alarmy",


@@ 174,10 175,10 @@
  "app_notes_edited": "Edytowano",
  "app_notes_delete_note": "Usuń",
  "app_notes_note_delete_confirmation": "Czy na pewno chcesz usunąć tę notatkę?",
  "app_notes_no_notes": "<text align='center' color='5'>Nie ma jeszcze żadnych notatek.<p>Wciśnij <b>lewą strzałkę</b>, by dodać nową.</p></text>",
  "app_notes_no_notes": "<text align='center' color='4'>Nie ma jeszcze żadnych notatek.<p>Wciśnij <b>lewą strzałkę</b>, by dodać nową.</p></text>",
  "app_notes_search_no_results": "Nie znaleziono notatek",
  "app_calllog_title_main": "Połączenia",
  "app_calllog_no_calls": "<text align='center' color='5'>Brak połączeń.</text>",
  "app_calllog_no_calls": "<text align='center' color='4'>Brak połączeń.</text>",
  "app_calllog_type": "Połączenie",
  "app_calllog_duration": "Czas trwania",
  "app_calllog_incoming_call": "Odebrane",


@@ 187,8 188,6 @@
  "app_calllog_date": "Data",
  "app_calllog_options_delete_call": "Usuń połączenie",
  "app_calllog_delete_call_confirmation": "Czy chcesz usunąć to połączenie z listy?",
  "app_calllog_no_calls": "Brak połączeń.",
  "app_phonebook_no_contacts": "Brak kontaktów.<p>Naciśnij <b>strzałkę w lewo</b>, aby dodać nowe.</p>",
  "app_music_player_artists": "<text color='9'>Wykonawcy</text>",
  "app_music_player_albums": "<text color='9'>Albumy</text>",
  "app_music_player_playlists": "<text color='9'>Playlisty</text>",


@@ 323,7 322,7 @@
  "app_call_emergency_text": "Połączenie alarmowe",
  "app_call_wrong_emergency": "Nie można wykonać połączenia.\n$NUMBER nie jest numerem alarmowym.",
  "app_messages_title_main": "Wiadomości",
  "app_messages_no_messages": "<text align='center' color='5'>Nie ma jeszcze żadnych wiadomości.<p>Wciśnij <b>lewą strzałkę</b>, by dodać nową.</p></text>",
  "app_messages_no_messages": "<text align='center' color='4'>Nie ma jeszcze żadnych wiadomości.<p>Wciśnij <b>lewą strzałkę</b>, by dodać nową.</p></text>",
  "app_messages_thread_delete_confirmation": "Usunąć tę rozmowę?",
  "app_messages_message_delete_confirmation": "<text align='center'><p>Czy na pewno chcesz <text weight='bold'>usunąć</text></p>tę wiadomość?</text>",
  "app_messages_thread_no_result": "Brak wyników",


@@ 523,7 522,7 @@
  "common_search_uc": "Szukaj",
  "common_search_results": "Wyniki wyszukiwania",
  "app_phonebook_search_no_results": "Nie znaleziono kontaktów",
  "app_phonebook_no_contacts": "<text align='center' color='5'>Brak kontaktów.<p>Naciśnij <b>'w lewo'</b> by dodać kontakt.</p></text>",
  "app_phonebook_no_contacts": "<text align='center' color='4'>Brak kontaktów.<p>Naciśnij <b>'w lewo'</b> by dodać kontakt.</p></text>",
  "app_phonebook_contact_title": "Dodaj kontakt",
  "app_phonebook_contact_no_name": "brak nazwy",
  "app_phonebook_contact_information": "Informacje",


@@ 617,7 616,7 @@
  "app_bell_bedtime_notification": "Pora na sen",
  "app_bellmain_power_nap": "Drzemka",
  "app_bellmain_meditation_timer": "Medytacja",
  "app_bellmain_background_sounds": "Biblioteka",
  "app_bellmain_background_sounds": "Relaks",
  "app_bellmain_settings": "Ustawienia",
  "app_bellmain_main_window_title": "Mudita Harmony",
  "app_bell_onboarding_finalize": "Dobra robota!",


@@ 634,37 633,39 @@
  "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_bedtime_settings_tone": "Dźwięk",
  "app_bell_settings_bedtime_settings_volume": "Głośność",
  "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_length": "Długość drzemki",
  "app_bell_settings_alarm_settings_snooze_chime_interval": "Interwał dźwięku wybudzania",
  "app_bell_settings_alarm_settings_snooze_chime_interval": "Interwał dźwięku",
  "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 wybudzania",
  "app_bell_settings_alarm_settings_snooze_chime_volume": "Głośność wybudzania",
  "app_bellmain_home_screen_bottom_desc": "Następny alarm zadzwoni",
  "app_bell_settings_alarm_settings_snooze_chime_tone": "Dźwięk",
  "app_bell_settings_alarm_settings_snooze_chime_volume": "Głośność",
  "app_bellmain_home_screen_bottom_desc": "Alarm zadzwoni",
  "app_bellmain_home_screen_bottom_desc_in": "za",
  "app_bellmain_home_screen_bottom_desc_less_than": "mniej niż",
  "app_bellmain_home_screen_bottom_desc_and": "i",
  "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_mode_top_message": "Tryb podświetlenia",
  "app_bell_settings_frontlight_mode_auto": "automatyczny",
  "app_bell_settings_frontlight_mode_on_demand": "na żądanie",
  "app_bell_settings_frontlight_mode_on_demand": "manualny",
  "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_alarm_set_not_active": "Naciśnij głęboko, aby aktywować.",
  "app_bell_background_sounds_timer_title": "Wyłącznik czasowy",
  "app_bell_background_sounds_timer_off": "Wyłączony",
  "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_top_description": "Wstępne budzenie",
  "app_bell_settings_alarm_settings_prewake_up_chime_bottom_description": "przed alarmem",
  "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_chime_volume": "Głośność",
  "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_tone": "Dźwięk alarmu",


@@ 673,8 674,8 @@
  "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_factory_reset": "Ustawienia fabryczne",
  "app_bell_settings_display_factory_reset_confirmation": "<text>Przywrócić ustawienia<br></br>fabryczne ?</text>",
  "app_bell_settings_advanced_factory_reset": "Reset",
  "app_bell_settings_display_factory_reset_confirmation": "<text>Ustawienia fabryczne?</text>",
  "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>",


@@ 684,9 685,9 @@
  "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_progress": "Medytacja",
  "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>"
}
}
\ No newline at end of file

M image/assets/lang/Svenska.json => image/assets/lang/Svenska.json +3 -3
@@ 92,7 92,7 @@
  "app_alarm_clock_repeat_everyday": "Varje dag",
  "app_alarm_clock_repeat_week_days": "Vardagar",
  "app_alarm_clock_repeat_custom": "Eget val",
  "app_alarm_clock_no_alarms_information": "<text align='center' color='5'>Inga larmtider än.<p>Tryck <b>vänsterpil</b> för att lägga till en.</p></text>",
  "app_alarm_clock_no_alarms_information": "<text align='center' color='4'>Inga larmtider än.<p>Tryck <b>vänsterpil</b> för att lägga till en.</p></text>",
  "app_alarm_clock_options_edit": "Redigera",
  "app_alarm_clock_options_delete": "Radera",
  "app_alarm_clock_options_turn_off_all_alarms": "Stäng av alla larm",


@@ 124,7 124,7 @@
  "app_notes_edited": "Redigerad",
  "app_notes_delete_note": "Radera",
  "app_notes_note_delete_confirmation": "Vill du radera den här anteckningen?",
  "app_notes_no_notes": "<text align='center' color='5'>Inga anteckningar än.<p>Tryck <b>vänsterpil</b> för att lägga till en.</p></text>",
  "app_notes_no_notes": "<text align='center' color='4'>Inga anteckningar än.<p>Tryck <b>vänsterpil</b> för att lägga till en.</p></text>",
  "app_notes_search_no_results": "Inga anteckningar hittade.",
  "app_calllog_title_main": "Samtal",
  "app_calllog_type": "Samtal",


@@ 261,7 261,7 @@
  "app_call_emergency_text": "Nödsamtal",
  "app_call_wrong_emergency": "Kan inte ringa..\n$NUMBER är inte ett nödnummer.",
  "app_messages_title_main": "Meddelanden",
  "app_messages_no_messages": "<text align='center' color='5'>Inga meddelanden än.<p>Tryck <b>vänsterpil</b> för att börja skriva ett.</p></text>",
  "app_messages_no_messages": "<text align='center' color='4'>Inga meddelanden än.<p>Tryck <b>vänsterpil</b> för att börja skriva ett.</p></text>",
  "app_messages_thread_delete_confirmation": "Radera konversation?",
  "app_messages_message_delete_confirmation": "<text align='center'><p>Vill du <text weight='bold'>radera</text></p>konversationen?</text>",
  "app_messages_thread_no_result": "Inga resultat",

M module-apps/application-settings/ApplicationSettings.cpp => module-apps/application-settings/ApplicationSettings.cpp +4 -1
@@ 6,6 6,7 @@
#include <application-settings/windows/SettingsMainWindow.hpp>
#include <application-settings/windows/advanced/AdvancedOptionsWindow.hpp>
#include <application-settings/windows/advanced/InformationWindow.hpp>
#include <application-settings/windows/advanced/TextImageColorWindow.hpp>
#include <application-settings/windows/advanced/UITestWindow.hpp>
#include <application-settings/windows/advanced/ColorTestWindow.hpp>
#include <application-settings/windows/advanced/StatusBarImageTypeWindow.hpp>


@@ 375,7 376,9 @@ namespace app
                              [](ApplicationCommon *app, const std::string &name) {
                                  return std::make_unique<gui::StatusBarImageTypeWindow>(app);
                              });

        windowsFactory.attach(gui::window::name::text_image_color, [](ApplicationCommon *app, const std::string &name) {
            return std::make_unique<gui::TextImageColorWindow>(app);
        });
        // Bluetooth
        windowsFactory.attach(gui::window::name::bluetooth, [](ApplicationCommon *app, const std::string &name) {
            return std::make_unique<gui::BluetoothWindow>(app);

M module-apps/application-settings/CMakeLists.txt => module-apps/application-settings/CMakeLists.txt +1 -0
@@ 48,6 48,7 @@ target_sources(application-settings
        windows/advanced/AdvancedOptionsWindow.cpp
        windows/advanced/ColorTestWindow.cpp
        windows/advanced/InformationWindow.cpp
        windows/advanced/TextImageColorWindow.cpp
        windows/advanced/UITestWindow.cpp
        windows/advanced/StatusBarImageTypeWindow.cpp
        windows/apps/AlarmClockWindow.cpp

M module-apps/application-settings/windows/WindowNames.hpp => module-apps/application-settings/windows/WindowNames.hpp +5 -4
@@ 5,11 5,12 @@

namespace gui::window::name
{
    inline constexpr auto advanced          = "Advanced";
    inline constexpr auto information       = "Information";
    inline constexpr auto ui_test           = "UI Test";
    inline constexpr auto color_test_window = "Color Test";
    inline constexpr auto advanced            = "Advanced";
    inline constexpr auto information         = "Information";
    inline constexpr auto ui_test             = "UI Test";
    inline constexpr auto color_test_window   = "Color Test";
    inline constexpr auto status_bar_img_type = "StatusBarImgType";
    inline constexpr auto text_image_color    = "TextImageColor";

    inline constexpr auto bluetooth               = "Bluetooth";
    inline constexpr auto all_devices             = "AllDevices";

M module-apps/application-settings/windows/advanced/AdvancedOptionsWindow.cpp => module-apps/application-settings/windows/advanced/AdvancedOptionsWindow.cpp +1 -0
@@ 27,6 27,7 @@ std::list<gui::Option> advancedOptions(app::ApplicationCommon *app)
    addMenu("UI Test", gui::window::name::ui_test);
    addMenu("Color Test", gui::window::name::color_test_window);
    addMenu("Statusbar Image Test", gui::window::name::status_bar_img_type);
    addMenu("Text Image Color test", gui::window::name::text_image_color);

    return l;
}

A module-apps/application-settings/windows/advanced/TextImageColorWindow.cpp => module-apps/application-settings/windows/advanced/TextImageColorWindow.cpp +72 -0
@@ 0,0 1,72 @@
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#include "TextImageColorWindow.hpp"

#include <application-settings/windows/WindowNames.hpp>
#include <ApplicationCommon.hpp>

namespace gui
{
    TextImageColorWindow::TextImageColorWindow(app::ApplicationCommon *app)
        : AppWindow(app, window::name::status_bar_img_type)
    {
        AppWindow::buildInterface();

        navBar->setText(nav_bar::Side::Right, utils::translate(style::strings::common::back));
        setTitle("Image and Text Color test");

        std::string text =
            std::string("<text align='center' color='") + std::to_string(colour) +
            std::string("'>Press <b>left/right arrow</b><br></br> to change colour: |") + std::to_string(colour) +
            std::string("| <br></br><br></br>Press <b>top/bottom arrow </b> <br></br> to change image: |") +
            std::to_string(image_nr) + std::string("|<br></br></text>");

        testIcon = new Icon(this,
                            0,
                            style::window::default_vertical_pos,
                            style::window_width,
                            style::window_height - style::window::default_vertical_pos - style::nav_bar::height,
                            "empty_list_add_test_W_G_1",
                            text);
    }

    bool TextImageColorWindow::onInput(const InputEvent &inputEvent)
    {
        if (!inputEvent.isShortRelease()) {
            return false;
        }

        if (AppWindow::onInput(inputEvent)) {
            return true;
        }

        if (inputEvent.isShortRelease(KeyCode::KEY_LEFT) && colour != 0) {
            colour--;
        }
        else if (inputEvent.isShortRelease(KeyCode::KEY_RIGHT) && colour != 15) {
            colour++;
        }

        if (inputEvent.isShortRelease(KeyCode::KEY_UP) && image_nr != 1) {
            image_nr--;
        }
        else if (inputEvent.isShortRelease(KeyCode::KEY_DOWN) && image_nr != 4) {
            image_nr++;
        }

        std::string text =
            std::string("<text align='center' color='") + std::to_string(colour) +
            std::string("'>Press <b>left/right arrow</b><br></br> to change colour: |") + std::to_string(colour) +
            std::string("| <br></br><br></br>Press <b>top/bottom arrow </b> <br></br> to change image: |") +
            std::to_string(image_nr) + std::string("|<br></br></text>");

        std::string imageName = std::string("empty_list_add_test_W_G_") + std::to_string(image_nr);

        testIcon->text->setRichText(text);
        testIcon->image->set(imageName);

        application->refreshWindow(RefreshModes::GUI_REFRESH_DEEP);
        return true;
    }
} // namespace gui

A module-apps/application-settings/windows/advanced/TextImageColorWindow.hpp => module-apps/application-settings/windows/advanced/TextImageColorWindow.hpp +24 -0
@@ 0,0 1,24 @@
// 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 <AppWindow.hpp>
#include <Text.hpp>
#include <Icon.hpp>

namespace gui
{
    class TextImageColorWindow : public AppWindow
    {
      protected:
        unsigned int colour   = 0;
        unsigned int image_nr = 1;
        Icon *testIcon        = nullptr;

      public:
        explicit TextImageColorWindow(app::ApplicationCommon *app);

        bool onInput(const InputEvent &inputEvent) override;
    };
} // namespace gui

M module-apps/apps-common/popups/WindowWithTimer.cpp => module-apps/apps-common/popups/WindowWithTimer.cpp +5 -3
@@ 27,11 27,13 @@ namespace gui

    void WindowWithTimer::resetTimer(const std::chrono::seconds newTimeout)
    {
        timeout = newTimeout;
        if (newTimeout != noTimeoutChange) {
            timeout = newTimeout;
        }
        if (!popupTimer.isValid()) {
            popupTimer = app::GuiTimerFactory::createSingleShotTimer(application, this, popup::timerName, newTimeout);
            popupTimer = app::GuiTimerFactory::createSingleShotTimer(application, this, popup::timerName, timeout);
        }
        popupTimer.restart(newTimeout);
        popupTimer.restart(timeout);
    }

    void WindowWithTimer::detachTimerIfExists()

M module-apps/apps-common/popups/WindowWithTimer.hpp => module-apps/apps-common/popups/WindowWithTimer.hpp +3 -2
@@ 8,7 8,8 @@

namespace gui
{
    inline constexpr auto defautTimeout = std::chrono::seconds{3};
    inline constexpr auto defautTimeout   = std::chrono::seconds{3};
    inline constexpr auto noTimeoutChange = std::chrono::seconds::zero();
    class WindowWithTimer : public gui::AppWindow
    {
      private:


@@ 27,6 28,6 @@ namespace gui

      protected:
        void detachTimerIfExists();
        void resetTimer(const std::chrono::seconds newTimeout = defautTimeout);
        void resetTimer(const std::chrono::seconds newTimeout = noTimeoutChange);
    };
} // namespace gui

M module-bsp/board/rt1051/bellpx/bsp/fuel_gauge/CW2015CHBD.hpp => module-bsp/board/rt1051/bellpx/bsp/fuel_gauge/CW2015CHBD.hpp +5 -4
@@ 59,9 59,10 @@ namespace bsp::fuel_gauge

    /* got from ODM init code */
    constexpr uint8_t battery_info_config_info[BATTERY_INFO_SIZE] = {
        0x15, 0x7E, 0x80, 0x6E, 0x68, 0x64, 0x61, 0x62, 0x61, 0x5F, 0x5A, 0x56, 0x53, 0x51, 0x4F, 0x3B,
        0x2E, 0x27, 0x24, 0x24, 0x29, 0x36, 0x4C, 0x5E, 0x5E, 0x49, 0x0A, 0x3E, 0x19, 0x32, 0x44, 0x4D,
        0x4F, 0x4F, 0x52, 0x52, 0x39, 0x0E, 0x92, 0x15, 0x07, 0x15, 0x52, 0x7E, 0x8D, 0x8E, 0x8E, 0x42,
        0x60, 0x84, 0x95, 0xA5, 0x80, 0x76, 0xBD, 0xCB, 0x2F, 0x00, 0x64, 0xA5, 0xB5, 0x11, 0xB0, 0x29};
        // profile_DEM50X_2nd_20211012
        0x15, 0x15, 0x6E, 0x67, 0x65, 0x62, 0x60, 0x60, 0x5F, 0x5E, 0x5B, 0x59, 0x55, 0x50, 0x41, 0x33,
        0x2A, 0x26, 0x24, 0x27, 0x31, 0x46, 0x55, 0x5B, 0x47, 0x4A, 0x0A, 0x3E, 0x38, 0x58, 0x59, 0x63,
        0x67, 0x63, 0x62, 0x64, 0x3D, 0x1B, 0x6F, 0x15, 0x07, 0x21, 0x54, 0x85, 0x8F, 0x90, 0x90, 0x44,
        0x63, 0x86, 0x94, 0x99, 0x80, 0x89, 0xBC, 0xCB, 0x2F, 0x00, 0x64, 0xA5, 0xB5, 0xC1, 0x46, 0xAE};

} // namespace bsp::fuel_gauge

M products/BellHybrid/BinaryAssetsVersions.cmake => products/BellHybrid/BinaryAssetsVersions.cmake +1 -1
@@ 1,7 1,7 @@
# This file sets versions of downloaded binaries for release packaging purposes

if( NOT DEFINED ECOBOOT_BIN_VERSION)
    set(ECOBOOT_BIN_VERSION 1.0.18 CACHE STRING "bootloader binary version to download from bootloader release page")
    set(ECOBOOT_BIN_VERSION 1.0.19 CACHE STRING "bootloader binary version to download from bootloader release page")
endif()

if (NOT DEFINED UPDATER_BIN_VERSION)

M products/BellHybrid/CMakeLists.txt => products/BellHybrid/CMakeLists.txt +1 -0
@@ 104,4 104,5 @@ add_subdirectory(services)
add_subdirectory(sys)

option(CONFIG_ENABLE_TEMP "Enable displaying temperature" OFF)
option(CONFIG_SHOW_MEMORY_INFO "Enable displaying memory info" OFF)
configure_file(config/ProductConfig.in.hpp ${CMAKE_BINARY_DIR}/ProductConfig.hpp  @ONLY)

M products/BellHybrid/apps/application-bell-background-sounds/windows/BGSoundsProgressWindow.cpp => products/BellHybrid/apps/application-bell-background-sounds/windows/BGSoundsProgressWindow.cpp +1 -1
@@ 76,6 76,7 @@ namespace gui
    void BGSoundsProgressWindow::onBeforeShow(ShowMode mode, SwitchData *data)
    {
        presenter->onBeforeShow();
        updateTime();

        if (mode == ShowMode::GUI_SHOW_RETURN && presenter->isPaused()) {
            presenter->resume();


@@ 107,7 108,6 @@ namespace gui
        progressBar = createProgress(vBox);
        timerText   = createTimer(body->lastBox);
        time        = createClock(body->firstBox);
        updateTime();
        body->firstBox->resizeItems();
        vBox->resizeItems();


M products/BellHybrid/apps/application-bell-main/presenters/StateController.cpp => products/BellHybrid/apps/application-bell-main/presenters/StateController.cpp +3 -3
@@ 171,12 171,12 @@ namespace app::home_screen
            };

            auto processRotateLeft = [](AbstractView &view, AbstractPresenter &presenter) {
                presenter.spawnTimer();
                presenter.spawnTimer(defaultAlarmSetTime);
                view.decAlarmMinute();
            };

            auto processRotateRight = [](AbstractView &view, AbstractPresenter &presenter) {
                presenter.spawnTimer();
                presenter.spawnTimer(defaultAlarmSetTime);
                view.incAlarmMinute();
            };
        } // namespace AlarmEdit


@@ 381,7 381,7 @@ namespace app::home_screen
                                             "AlarmRingingDeactivatedWait"_s + sml::on_exit<_> / AlarmRingingDeactivatedWait::exit,
                                             "AlarmRingingDeactivatedWait"_s + event<Events::Reset> = "Init"_s,
                                             "AlarmRingingDeactivatedWait"_s + event<Events::Timer> = "Deactivated"_s,
                                             "AlarmRingingDeactivatedWait"_s + event<Events::DeepDownPress> = "DeactivatedWait"_s,
                                             "AlarmRingingDeactivatedWait"_s + event<Events::DeepUpPress> = "ActivatedWait"_s,
                                             "AlarmRingingDeactivatedWait"_s + event<Events::BackPress> = "Deactivated"_s,
                                             "AlarmRingingDeactivatedWait"_s + event<Events::LightPress>/ Helpers::switchToMenu = "Deactivated"_s,
                                             "AlarmRingingDeactivatedWait"_s + event<Events::RotateLeftPress> = "DeactivatedEdit"_s,

M products/BellHybrid/apps/application-bell-main/presenters/StateController.hpp => products/BellHybrid/apps/application-bell-main/presenters/StateController.hpp +1 -0
@@ 18,6 18,7 @@ namespace app::home_screen
{

    inline constexpr auto defaultAlarmRingingTime = std::chrono::minutes(5);
    inline constexpr auto defaultAlarmSetTime     = std::chrono::seconds{10};

    class AbstractView;
    class AbstractPresenter;

M products/BellHybrid/apps/application-bell-main/widgets/BellBattery.hpp => products/BellHybrid/apps/application-bell-main/widgets/BellBattery.hpp +1 -1
@@ 16,7 16,7 @@ namespace gui
        constexpr auto battery_low        = "bell_battery_lvl1";
        constexpr auto battery_critical   = "bell_battery_empty";
        constexpr auto battery_charging   = "bell_battery_charging";
        constexpr auto font_small         = style::window::font::verybiglight;
        constexpr auto font_small         = style::window::font::largelight;
        constexpr auto image_h            = 64;
        constexpr auto image_w            = 64U;
        constexpr auto image_right_margin = 10U;

M products/BellHybrid/apps/application-bell-main/windows/BellHomeScreenWindow.cpp => products/BellHybrid/apps/application-bell-main/windows/BellHomeScreenWindow.cpp +1 -1
@@ 122,7 122,7 @@ namespace gui
        battery = new BellBattery(bottomBox, 0, 0, 0, 0);
        battery->setMinimumSize(battery::battery_widget_w, battery::battery_widget_h);
        battery->setEdges(RectangleEdge::None);
        battery->setAlignment(Alignment(Alignment::Horizontal::Left, Alignment::Vertical::Center));
        battery->setAlignment(Alignment(Alignment::Horizontal::Center, Alignment::Vertical::Center));
        battery->setVisible(false);

        bottomText = new TextFixedSize(bottomBox, 0, 0, 0, 0);

M products/BellHybrid/apps/application-bell-meditation-timer/data/MeditationStyle.hpp => products/BellHybrid/apps/application-bell-meditation-timer/data/MeditationStyle.hpp +1 -6
@@ 35,12 35,7 @@ namespace app::meditationStyle
            constexpr inline auto font = style::window::font::largelight;
        } // namespace minute

        namespace list
        {
            constexpr inline auto timeUnitSingular = "common_minute_lower";
            constexpr inline auto timeUnitPlural   = "common_minutes_lower";
        } // namespace list
    }     // namespace icStyle
    } // namespace icStyle

    namespace mrStyle
    {

M products/BellHybrid/apps/application-bell-meditation-timer/presenter/MeditationProgressPresenter.cpp => products/BellHybrid/apps/application-bell-meditation-timer/presenter/MeditationProgressPresenter.cpp +5 -0
@@ 92,4 92,9 @@ namespace app::meditation
            getView()->intervalReached();
        }
    }

    void MeditationProgressPresenter::onBeforeShow()
    {
        getView()->setTimeFormat(timeModel->getTimeFormat());
    }
} // namespace app::meditation

M products/BellHybrid/apps/application-bell-meditation-timer/presenter/MeditationProgressPresenter.hpp => products/BellHybrid/apps/application-bell-meditation-timer/presenter/MeditationProgressPresenter.hpp +2 -0
@@ 51,6 51,7 @@ namespace app::meditation
            virtual void resume()                                                   = 0;
            virtual void abandon()                                                  = 0;
            virtual void finish()                                                   = 0;
            virtual void onBeforeShow()                                             = 0;
        };
    };



@@ 82,5 83,6 @@ namespace app::meditation
        void resume() override;
        void abandon() override;
        void finish() override;
        void onBeforeShow() override;
    };
} // namespace app::meditation

M products/BellHybrid/apps/application-bell-meditation-timer/windows/MeditationRunningWindow.cpp => products/BellHybrid/apps/application-bell-meditation-timer/windows/MeditationRunningWindow.cpp +2 -1
@@ 96,7 96,6 @@ namespace gui
        time = new BellStatusClock(body->firstBox);
        time->setMaximumSize(body->firstBox->getWidth(), body->firstBox->getHeight());
        time->setAlignment(Alignment(Alignment::Horizontal::Center, Alignment::Vertical::Top));
        updateTime();
        body->firstBox->resizeItems();

        dimensionChangedCallback = [&](Item &, const BoundingBox &newDim) -> bool {


@@ 108,6 107,8 @@ namespace gui
    void MeditationRunningWindow::onBeforeShow(ShowMode mode, SwitchData *data)
    {
        AppWindow::onBeforeShow(mode, data);
        presenter->onBeforeShow();
        updateTime();

        if (mode == ShowMode::GUI_SHOW_INIT) {
            playGong();

M products/BellHybrid/apps/application-bell-onboarding/ApplicationBellOnBoarding.cpp => products/BellHybrid/apps/application-bell-onboarding/ApplicationBellOnBoarding.cpp +2 -5
@@ 192,11 192,8 @@ namespace app
            informationState = OnBoarding::InformationStates::DeepClickCorrectionInfo;
            displayInformation(msg->getWindowName());
        }
        if (selectedWindowCondition && informationState == OnBoarding::InformationStates::DeepClickCorrectionInfo) {
            informationState = OnBoarding::InformationStates::RotateInfo;
        }

        if (msg->getSenderWindowName() != gui::window::name::informationOnBoardingWindow) {
        else if (selectedWindowCondition &&
                 informationState == OnBoarding::InformationStates::DeepClickCorrectionInfo) {
            informationState = OnBoarding::InformationStates::RotateInfo;
        }
    }

M products/BellHybrid/apps/application-bell-onboarding/presenter/OnBoardingLanguageWindowPresenter.cpp => products/BellHybrid/apps/application-bell-onboarding/presenter/OnBoardingLanguageWindowPresenter.cpp +1 -3
@@ 11,9 11,7 @@ namespace app::OnBoarding

    std::vector<std::string> OnBoardingLanguageWindowPresenter::getLanguages()
    {
        auto languages = loader.getAvailableDisplayLanguages();
        std::sort(languages.begin(), languages.end());
        return languages;
        return languages.getSupportedLanguages();
    }

    unsigned OnBoardingLanguageWindowPresenter::getSelectedLanguageIndex()

M products/BellHybrid/apps/application-bell-onboarding/presenter/OnBoardingLanguageWindowPresenter.hpp => products/BellHybrid/apps/application-bell-onboarding/presenter/OnBoardingLanguageWindowPresenter.hpp +2 -2
@@ 5,7 5,7 @@

#include <apps-common/BasePresenter.hpp>
#include <apps-common/ApplicationCommon.hpp>
#include <i18n/i18n.hpp>
#include <common/Languages.hpp>

#include <vector>
#include <string>


@@ 33,7 33,7 @@ namespace app::OnBoarding
    class OnBoardingLanguageWindowPresenter : public OnBoardingLanguageWindowContract::Presenter
    {
      private:
        utils::LangLoader loader;
        common::Languages languages;
        app::ApplicationCommon *app;

      public:

M products/BellHybrid/apps/application-bell-powernap/data/PowerNapListItem.cpp => products/BellHybrid/apps/application-bell-powernap/data/PowerNapListItem.cpp +3 -10
@@ 5,19 5,12 @@
#include <i18n/i18n.hpp>
#include "data/PowerNapStyle.hpp"

#include <common/LanguageUtils.hpp>
namespace
{
    inline constexpr auto spinnerMax  = 180U;
    inline constexpr auto spinnerMin  = 1U;
    inline constexpr auto spinnerStep = 1U;

    std::string getTimeUnitName(int currentSpinnerValue)
    {
        using namespace gui::powerNapStyle::listItem;
        const auto isSingular = currentSpinnerValue == 1;
        return utils::translate(isSingular ? timeUnitSingular : timeUnitPlural);
    }

} // namespace
namespace gui
{


@@ 72,7 65,7 @@ namespace gui

        inputCallback = [&](Item &, const InputEvent &inputEvent) -> bool {
            if (body->onInput(inputEvent)) {
                setBottomDescribtionText(getTimeUnitName(spinner->getCurrentValue()));
                setBottomDescribtionText(utils::language::getCorrectMinutesNumeralForm(spinner->getCurrentValue()));
                return true;
            }
            return false;


@@ 87,7 80,7 @@ namespace gui
    void PowerNapListItem::setSpinnerValue(int value)
    {
        spinner->setCurrentValue(value);
        setBottomDescribtionText(getTimeUnitName(spinner->getCurrentValue()));
        setBottomDescribtionText(utils::language::getCorrectMinutesNumeralForm(spinner->getCurrentValue()));
        onValueChanged(value);
    }


M products/BellHybrid/apps/application-bell-powernap/data/PowerNapStyle.hpp => products/BellHybrid/apps/application-bell-powernap/data/PowerNapStyle.hpp +0 -5
@@ 11,11 11,6 @@ namespace gui::powerNapStyle
    inline constexpr auto napTimerFont    = style::window::font::verybig;
    inline constexpr auto napPeriodFont   = style::window::font::supersizeme;
    inline constexpr auto clockFont       = style::window::font::verybiglight;
    namespace listItem
    {
        inline constexpr auto timeUnitSingular = "common_minute_lower";
        inline constexpr auto timeUnitPlural   = "common_minutes_lower";
    } // namespace listItem

    namespace progress
    {

M products/BellHybrid/apps/application-bell-powernap/presenter/PowerNapProgressPresenter.cpp => products/BellHybrid/apps/application-bell-powernap/presenter/PowerNapProgressPresenter.cpp +5 -0
@@ 78,4 78,9 @@ namespace app::powernap
        return napFinished;
    }

    void PowerNapProgressPresenter::onBeforeShow()
    {
        getView()->setTimeFormat(timeModel->getTimeFormat());
    }

} // namespace app::powernap

M products/BellHybrid/apps/application-bell-powernap/presenter/PowerNapProgressPresenter.hpp => products/BellHybrid/apps/application-bell-powernap/presenter/PowerNapProgressPresenter.hpp +2 -0
@@ 46,6 46,7 @@ namespace app::powernap
            virtual void setTimer(std::unique_ptr<app::TimerWithCallbacks> &&timer) = 0;
            virtual void handleUpdateTimeEvent()                                    = 0;
            virtual bool isNapFinished()                                            = 0;
            virtual void onBeforeShow()                                             = 0;
        };
    };



@@ 68,6 69,7 @@ namespace app::powernap

        void onNapFinished();
        void onNapAlarmFinished();
        void onBeforeShow() override;

      public:
        PowerNapProgressPresenter(app::ApplicationCommon *app,

M products/BellHybrid/apps/application-bell-powernap/windows/PowerNapProgressWindow.cpp => products/BellHybrid/apps/application-bell-powernap/windows/PowerNapProgressWindow.cpp +6 -1
@@ 84,7 84,6 @@ namespace gui
        time = new BellStatusClock(body->firstBox);
        time->setMaximumSize(body->firstBox->getWidth(), body->firstBox->getHeight());
        time->setAlignment(Alignment(Alignment::Horizontal::Center, Alignment::Vertical::Top));
        updateTime();
        body->firstBox->resizeItems();

        dimensionChangedCallback = [&](Item &, const BoundingBox &newDim) -> bool {


@@ 141,4 140,10 @@ namespace gui
        }
        return true;
    }

    void PowerNapProgressWindow::onBeforeShow(ShowMode mode, SwitchData *data)
    {
        presenter->onBeforeShow();
        updateTime();
    }
} // namespace gui

M products/BellHybrid/apps/application-bell-powernap/windows/PowerNapProgressWindow.hpp => products/BellHybrid/apps/application-bell-powernap/windows/PowerNapProgressWindow.hpp +2 -0
@@ 30,6 30,8 @@ namespace gui

        void napEnded() override;

        void onBeforeShow(ShowMode mode, SwitchData *data) override;

      public:
        PowerNapProgressWindow(app::ApplicationCommon *app,
                               std::shared_ptr<app::powernap::PowerNapProgressContract::Presenter> presenter);

M products/BellHybrid/apps/application-bell-settings/models/advanced/AboutYourBellModel.cpp => products/BellHybrid/apps/application-bell-settings/models/advanced/AboutYourBellModel.cpp +3 -0
@@ 5,6 5,7 @@

#include <BellSettingsStyle.hpp>
#include <widgets/advanced/AboutYourBellListItem.hpp>
#include <ProductConfig.hpp>

#include <ListView.hpp>
#include <product/version.hpp>


@@ 46,6 47,7 @@ namespace app::bell_settings
                                           utils::translate("app_bell_settings_advanced_about_version"),
                                           gui::AboutYourBellListItem::TokenMap({{"$VERSION", std::string(VERSION)}})));

#if CONFIG_SHOW_MEMORY_INFO == 1
        struct statvfs stat;
        const auto result = statvfs(purefs::dir::getRootDiskPath().c_str(), &stat);
        if (result < 0) {


@@ 60,6 62,7 @@ namespace app::bell_settings
            utils::translate("app_bell_settings_advanced_about_storage_text"),
            gui::AboutYourBellListItem::TokenMap(
                {{"$USED_MEMORY", std::to_string(usedMB)}, {"$TOTAL_MEMORY", std::to_string(totalMB)}})));
#endif

        internalData.push_back(
            new gui::AboutYourBellListItem(utils::translate("app_bell_settings_advanced_about_info_title"),

M products/BellHybrid/apps/application-bell-settings/models/alarm_settings/SnoozeListItemProvider.cpp => products/BellHybrid/apps/application-bell-settings/models/alarm_settings/SnoozeListItemProvider.cpp +60 -35
@@ 3,6 3,7 @@

#include "SnoozeListItemProvider.hpp"
#include <common/widgets/ListItems.hpp>
#include <common/LanguageUtils.hpp>

#include <apps-common/ApplicationCommon.hpp>
#include <utility>


@@ 11,15 12,46 @@ namespace app::bell_settings
{
    using namespace gui;

    enum Intervals
    NumWithStringListItem::NumWithStringSpinner::Range getDefaultChimeIntervalRange()
    {
        Interval_1  = 1,
        Interval_2  = 2,
        Interval_5  = 5,
        Interval_10 = 10,
        Interval_15 = 15,
        Interval_30 = 30
    };
        const UTF8 minStr = utils::translate("common_minute_short");
        return {
            NumWithStringListItem::Value{utils::translate("app_settings_toggle_off")},
            NumWithStringListItem::Value{1, minStr},
            NumWithStringListItem::Value{2, minStr},
            NumWithStringListItem::Value{3, minStr},
            NumWithStringListItem::Value{5, minStr},
        };
    }

    NumWithStringListItem::NumWithStringSpinner::Range transformChimeIntervalsRange(const std::uint32_t chimeLength)
    {
        auto chimeIntervals = getDefaultChimeIntervalRange();

        chimeIntervals.erase(
            std::remove_if(chimeIntervals.begin() + 1,
                           chimeIntervals.end(),
                           [chimeLength](const auto &e) { return e.getValue().value() >= chimeLength; }),
            chimeIntervals.end());

        return chimeIntervals;
    }

    std::optional<NumWithStringListItem::Value> calculateCurrentChimeIntervalValue(
        const NumWithStringListItem::NumWithStringSpinner::Range &range,
        const NumWithStringListItem::Value &chimeInterval)
    {
        if (range.size() == 1) {
            return {};
        }

        if (chimeInterval.getValue() && (chimeInterval.getValue().value() >= range.back().getValue().value())) {
            return range.back();
        }
        else {
            return chimeInterval;
        }
    }

    SnoozeListItemProvider::SnoozeListItemProvider(AbstractSnoozeSettingsModel &model,
                                                   std::vector<UTF8> chimeTonesRange)


@@ 41,21 73,16 @@ namespace app::bell_settings
        constexpr auto snoozeLengthMin  = 1U;
        constexpr auto snoozeLengthMax  = 30U;

        auto chimeLengthBottomDescription = model.getSnoozeLength().getValue() > 1
                                                ? utils::translate("common_minutes_lower")
                                                : utils::translate("common_minute_lower");
        auto chimeLength                  = new NumListItem(model.getSnoozeLength(),
        auto chimeLengthBottomDescription =
            utils::language::getCorrectMinutesNumeralForm(model.getSnoozeLength().getValue());
        ;
        auto chimeLength = new NumListItem(model.getSnoozeLength(),
                                           UIntegerSpinner::Range{snoozeLengthMin, snoozeLengthMax, snoozeLengthStep},
                                           utils::translate("app_bell_settings_alarm_settings_snooze_length"),
                                           chimeLengthBottomDescription);

        chimeLength->setOnValueChanged([chimeLength](const std::uint32_t &val) {
            if (val == 1) {
                chimeLength->setBottomDescribtionText(utils::translate("common_minute_lower"));
            }
            else {
                chimeLength->setBottomDescribtionText(utils::translate("common_minutes_lower"));
            }
            chimeLength->setBottomDescribtionText(utils::language::getCorrectMinutesNumeralForm(val));
        });

        chimeLength->onEnter = [onOff, this]() {


@@ 66,33 93,31 @@ namespace app::bell_settings

        internalData.emplace_back(chimeLength);

        const UTF8 minStr = utils::translate("common_minute_short");
        const auto range  = NumWithStringListItem::NumWithStringSpinner::Range{NumWithStringListItem::Value{0, minStr}};

        auto chimeInterval = new NumWithStringListItem(
            model.getSnoozeChimeInterval(),
            range,
            getDefaultChimeIntervalRange(),
            utils::translate("app_bell_settings_alarm_settings_snooze_chime_interval"),
            utils::translate("app_bell_settings_alarm_settings_snooze_chime_interval_bot_desc"));
        chimeLength->setValue();

        internalData.emplace_back(chimeInterval);

        chimeLength->onProceed = [chimeInterval, chimeLength, this]() {
            if (chimeInterval != nullptr) {
                auto val = chimeLength->getCurrentValue();
                NumWithStringListItem::NumWithStringSpinner::Range chimeRange;
                const UTF8 minStr = utils::translate("common_minute_short");
                chimeRange.push_back(NumWithStringListItem::Value{utils::translate("app_alarm_clock_no_snooze")});
                for (unsigned int i = 1; i <= val; i++) {
                    if ((i != Intervals::Interval_1) && (i != Intervals::Interval_2) && (i != Intervals::Interval_5) &&
                        (i != Intervals::Interval_10) && (i != Intervals::Interval_15) &&
                        (i != Intervals::Interval_30)) {
                        continue;
                    }
                    chimeRange.push_back(NumWithStringListItem::Value{i, minStr});
                const auto currentChimeLength   = chimeLength->getCurrentValue();
                const auto currentChimeInterval = chimeInterval->getCurrentValue();
                const auto calculatedRange      = transformChimeIntervalsRange(currentChimeLength);
                const auto calculatedChimeInterval =
                    calculateCurrentChimeIntervalValue(calculatedRange, currentChimeInterval);

                if (calculatedChimeInterval) {
                    chimeInterval->getSpinner()->setRange(calculatedRange);
                    chimeInterval->getSpinner()->setCurrentValue(calculatedChimeInterval.value());
                    chimeInterval->setArrowsVisibility();
                }
                else {
                    this->onExit();
                }
                chimeInterval->getSpinner()->setRange(chimeRange);
                chimeInterval->setArrowsVisibility(chimeRange);
            }
            return false;
        };

M products/BellHybrid/apps/application-bell-settings/presenter/advanced/LanguageWindowPresenter.cpp => products/BellHybrid/apps/application-bell-settings/presenter/advanced/LanguageWindowPresenter.cpp +1 -3
@@ 11,9 11,7 @@ namespace app::bell_settings

    std::vector<std::string> LanguageWindowPresenter::getLanguages() const
    {
        auto languages = loader.getAvailableDisplayLanguages();
        std::sort(languages.begin(), languages.end());
        return languages;
        return languages.getSupportedLanguages();
    }

    std::string LanguageWindowPresenter::getSelectedLanguage() const

M products/BellHybrid/apps/application-bell-settings/presenter/advanced/LanguageWindowPresenter.hpp => products/BellHybrid/apps/application-bell-settings/presenter/advanced/LanguageWindowPresenter.hpp +2 -2
@@ 5,7 5,7 @@

#include <apps-common/BasePresenter.hpp>
#include <apps-common/ApplicationCommon.hpp>
#include <i18n/i18n.hpp>
#include <common/Languages.hpp>

#include <vector>
#include <string>


@@ 33,7 33,7 @@ namespace app::bell_settings
    class LanguageWindowPresenter : public LanguageWindowContract::Presenter
    {
      private:
        utils::LangLoader loader;
        common::Languages languages;
        app::ApplicationCommon *app{};

      public:

M products/BellHybrid/apps/application-bell-settings/widgets/advanced/AboutYourBellListItem.cpp => products/BellHybrid/apps/application-bell-settings/widgets/advanced/AboutYourBellListItem.cpp +1 -1
@@ 14,7 14,7 @@ namespace gui
    {
        setMinimumSize(bell_settings_style::about_your_bell_window::list_item::width,
                       bell_settings_style::about_your_bell_window::list_item::height);
        setMargins(Margins(0, style::margins::big, 0, style::margins::big));
        setMargins(Margins(0, style::margins::big, 0, style::margins::huge));
        activeItem = false;

        body = new VBox(this, 0, 0, 0, 0);

M products/BellHybrid/apps/application-bell-settings/windows/advanced/AboutYourBellWindow.cpp => products/BellHybrid/apps/application-bell-settings/windows/advanced/AboutYourBellWindow.cpp +4 -3
@@ 28,11 28,12 @@ namespace gui

        list = new ListView(this,
                            style::window::default_left_margin,
                            style::window::default_vertical_pos,
                            style::listview::body_width_with_scroll,
                            style::window::default_body_height,
                            top_margin,
                            width,
                            height,
                            presenter->getPagesProvider(),
                            listview::ScrollBarType::Fixed);
        list->setAlignment(Alignment(Alignment::Horizontal::Center, Alignment::Vertical::Center));

        setFocusItem(list);
        list->rebuildList();

M products/BellHybrid/apps/application-bell-settings/windows/advanced/AboutYourBellWindow.hpp => products/BellHybrid/apps/application-bell-settings/windows/advanced/AboutYourBellWindow.hpp +4 -0
@@ 18,6 18,10 @@ namespace gui
                            std::shared_ptr<app::bell_settings::AboutYourBellWindowContract::Presenter> presenter);

      private:
        static constexpr auto height     = 400;
        static constexpr auto width      = 380;
        static constexpr auto top_margin = 41;

        void buildInterface() override;

        ListView *list{};

M products/BellHybrid/apps/common/CMakeLists.txt => products/BellHybrid/apps/common/CMakeLists.txt +3 -0
@@ 13,6 13,7 @@ target_sources(application-bell-common
        src/BellPowerOffPresenter.cpp
        src/AlarmModel.cpp
        src/AudioModel.cpp
        src/LanguageUtils.cpp
        src/TimeModel.cpp
        src/SoundsRepository.cpp
        src/BellListItemProvider.cpp


@@ 40,7 41,9 @@ target_sources(application-bell-common
        src/options/OptionBellMenu.cpp
        src/options/BellOptionsNavigation.cpp
    PUBLIC
        include/common/Languages.hpp
        include/common/BellListItemProvider.hpp
        include/common/LanguageUtils.hpp
        include/common/SoundsRepository.hpp
        include/common/BellPowerOffPresenter.hpp
        include/common/windows/BellFactoryReset.hpp

A products/BellHybrid/apps/common/include/common/LanguageUtils.hpp => products/BellHybrid/apps/common/include/common/LanguageUtils.hpp +11 -0
@@ 0,0 1,11 @@
// 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 <string>

namespace utils::language
{
    auto getCorrectMinutesNumeralForm(int val) -> std::string;
} // namespace utils::language

A products/BellHybrid/apps/common/include/common/Languages.hpp => products/BellHybrid/apps/common/include/common/Languages.hpp +39 -0
@@ 0,0 1,39 @@
// 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 <i18n/i18n.hpp>

#include <algorithm>
#include <vector>
#include <array>
#include <string_view>

namespace common
{
    class Languages
    {
      public:
        std::vector<Language> getSupportedLanguages() const
        {
            auto languages = loader.getAvailableDisplayLanguages();
            languages.erase(
                std::remove_if(languages.begin(), languages.end(), [this](const auto &lang) { return matcher(lang); }),
                languages.end());
            std::sort(languages.begin(), languages.end());
            return languages;
        }

      private:
        bool matcher(const std::string_view language) const
        {
            const auto result = std::find(excludedLanguages.begin(), excludedLanguages.end(), language);
            return result != excludedLanguages.end();
        }

        static constexpr std::array<std::string_view, 1> excludedLanguages = {{"Svenska"}};
        utils::LangLoader loader;
    };

} // namespace common

M products/BellHybrid/apps/common/include/common/widgets/ListItems.hpp => products/BellHybrid/apps/common/include/common/widgets/ListItems.hpp +2 -1
@@ 63,7 63,8 @@ namespace gui
        {
            return spinner;
        }
        void setArrowsVisibility(const NumWithStringSpinner::Range &range);
        NumWithStringSpinner::Type getCurrentValue();
        void setArrowsVisibility();

      private:
        NumWithStringSpinner *spinner{};

A products/BellHybrid/apps/common/src/LanguageUtils.cpp => products/BellHybrid/apps/common/src/LanguageUtils.cpp +23 -0
@@ 0,0 1,23 @@
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#include <i18n/i18n.hpp>

namespace utils::language
{
    auto getCorrectMinutesNumeralForm(int val) -> std::string
    {
        if (val == 1) {
            return utils::translate("common_minute_lower");
        }
        if (utils::getDisplayLanguage() == "Polski") {
            if (val < 10 || val > 20) {
                if ((val % 10) == 2 || (val % 10) == 3 || (val % 10) == 4) {
                    return utils::translate("common_minutes_lower");
                }
            }
            return utils::translate("common_minutes_lower_genitive");
        }
        return utils::translate("common_minutes_lower");
    }
} // namespace utils::language

M products/BellHybrid/apps/common/src/TimeUtils.cpp => products/BellHybrid/apps/common/src/TimeUtils.cpp +2 -1
@@ 44,7 44,8 @@ namespace utils::time
                return std::to_string(hours) + " h";
            }
            else {
                return std::to_string(hours) + " h & " + std::to_string(minutes) + " min";
                return std::to_string(hours) + " h " + translate("app_bellmain_home_screen_bottom_desc_and") + " " +
                       std::to_string(minutes) + " min";
            }
        }(duration.getHours(), duration.getMinutes());
        return UTF8("<text>" + prefix + "<br />" + translate("app_bellmain_home_screen_bottom_desc_in") + " " +

M products/BellHybrid/apps/common/src/widgets/ListItems.cpp => products/BellHybrid/apps/common/src/widgets/ListItems.cpp +9 -6
@@ 103,7 103,7 @@ namespace gui
        inputCallback = [&, range](Item &item, const InputEvent &event) {
            const auto result = OnInputCallback(event);
            bottomText->setVisible(spinner->getCurrentValue().getValue().has_value());
            setArrowsVisibility(range);
            setArrowsVisibility();
            return result;
        };



@@ 117,7 117,7 @@ namespace gui
            const auto val = spinner->getCurrentValue().getValue();
            model.setValue(not val ? 0 : *val);
        };
        setValue = [&model, this, range]() {
        setValue = [&model, this]() {
            const auto modelValue = model.getValue();
            if (modelValue > 0) {
                spinner->setCurrentValue(Value{modelValue, minStr});


@@ 125,7 125,7 @@ namespace gui
            else {
                spinner->setCurrentValue(Value{minStr});
            }
            setArrowsVisibility(range);
            setArrowsVisibility();
        };
    }



@@ 134,10 134,13 @@ namespace gui
        return not spinner->getCurrentValue().getValue().has_value();
    }

    void NumWithStringListItem::setArrowsVisibility(const NumWithStringSpinner::Range &range)
    void NumWithStringListItem::setArrowsVisibility()
    {
        const auto selectedVal = spinner->getCurrentValue();
        body->setMinMaxArrowsVisibility(selectedVal == range.front(), selectedVal == range.back());
        body->setMinMaxArrowsVisibility(spinner->isAtMin(), spinner->isAtMax());
    }
    NumWithString<uint32_t, UTF8> NumWithStringListItem::getCurrentValue()
    {
        return spinner->getCurrentValue();
    }

    UTF8ListItem::UTF8ListItem(AbstractSettingsModel<UTF8> &model,

M products/BellHybrid/apps/common/src/windows/BellWelcomeWindow.cpp => products/BellHybrid/apps/common/src/windows/BellWelcomeWindow.cpp +1 -1
@@ 57,7 57,7 @@ namespace gui

    bool BellWelcomeWindow::onInput(const InputEvent &inputEvent)
    {
        if (inputEvent.isKeyRelease(KeyCode::KEY_LF)) {
        if (inputEvent.isKeyRelease(KeyCode::KEY_ENTER)) {
            if (onAction) {
                onAction();
            }

M products/BellHybrid/config/ProductConfig.in.hpp => products/BellHybrid/config/ProductConfig.in.hpp +1 -0
@@ 4,3 4,4 @@
#pragma once

#cmakedefine01 CONFIG_ENABLE_TEMP
#cmakedefine01 CONFIG_SHOW_MEMORY_INFO

M products/BellHybrid/services/appmgr/include/appmgr/IdleHandler.hpp => products/BellHybrid/services/appmgr/include/appmgr/IdleHandler.hpp +1 -1
@@ 11,7 11,7 @@

namespace app::manager
{
    constexpr auto idleReturnTimeout = std::chrono::seconds{10};
    constexpr auto idleReturnTimeout = std::chrono::seconds{180};
    using connectFunction            = std::function<bool(const std::type_info &, sys::MessageHandler)>;

    class IdleHandler

M products/BellHybrid/services/time/AlarmOperations.cpp => products/BellHybrid/services/time/AlarmOperations.cpp +4 -3
@@ 226,17 226,18 @@ namespace alarms

    bool AlarmOperations::handlePreWakeUp(const SingleEventRecord &event, PreWakeUp::Decision decision)
    {
        auto ret = false;
        if (auto alarmEventPtr = std::dynamic_pointer_cast<AlarmEventRecord>(event.parent); alarmEventPtr) {
            if (decision.timeForChime) {
                handleAlarmEvent(alarmEventPtr, alarms::AlarmType::PreWakeUpChime, true);
                return true;
                ret = true;
            }
            if (decision.timeForFrontlight) {
                handleAlarmEvent(alarmEventPtr, alarms::AlarmType::PreWakeUpFrontlight, true);
                return true;
                ret = true;
            }
        }
        return false;
        return ret;
    }

    bool AlarmOperations::processSnoozeChime(TimePoint now)

M products/PurePhone/config.cmake => products/PurePhone/config.cmake +1 -1
@@ 2,4 2,4 @@ set(CONFIG_SIMULATOR_DISPLAY_RES_X 480)
set(CONFIG_SIMULATOR_DISPLAY_RES_Y 600)

# Enable/disable USB MTP
option(ENABLE_USB_TASK "Enables usage of USB Task" ON)
option(ENABLE_USB_TASK "Enables usage of USB Task" OFF)

M third-party/usb_stack => third-party/usb_stack +1 -1
@@ 1,1 1,1 @@
Subproject commit 89a6f884ce5b8a837bed2819c5c24ec8bae47a2f
Subproject commit 9a21b9957c8fa5ac56b9c89e1c156560d7a0c69c

M tools/generate_update_image.sh => tools/generate_update_image.sh +8 -1
@@ 65,7 65,14 @@ function cleanStagingDir(){

function linkInStageing(){
    pushd ${STAGEING_DIR} 1> /dev/null
    ln -s ../sysroot/sys/current/assets

    mkdir assets
    pushd assets 1> /dev/null
    ln -s ../../sysroot/sys/current/assets/fonts
    ln -s ../../sysroot/sys/current/assets/images
    ln -s ../../sysroot/sys/current/assets/lang
    popd 1> /dev/null

    ln -s ../sysroot/sys/user
    ln -s ../sysroot/sys/current/${SOURCE_TARGET}-boot.bin boot.bin
    ln -s ../sysroot/sys/current/country-codes.db