~aleteoryx/muditaos

cd700b7c16a4ab403f76c619ee60bf63ddbc55c8 — Przemyslaw Brudny 4 years ago bd73b9f + fb9b9f4
Merge remote-tracking branch 'origin/stable'
46 files changed, 243 insertions(+), 310 deletions(-)

M Jenkinsfile
M Target_RT1051.cmake
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-onboarding/style/OnBoardingStyle.hpp
M module-apps/application-onboarding/windows/StartConfigurationWindow.cpp
M module-audio/Audio/Profiles/ProfileRoutingLoudspeaker.hpp
M module-bsp/board/rt1051/bsp/audio/CodecMAX98090.cpp
M module-bsp/board/rt1051/bsp/eMMC/fsl_mmc.c
M module-bsp/board/rt1051/bsp/eMMC/fsl_mmc.h
M module-bsp/board/rt1051/bsp/eMMC/fsl_sdmmc_common.h
M module-os/board/rt1051/CMakeLists.txt
M module-os/board/rt1051/_exit.c
M module-platform/rt1051/src/disk_emmc.cpp
M module-services/service-desktop/BackupRestore.cpp
M module-vfs/drivers/src/thirdparty/lwext4/ext4_bdev.cpp
M products/BellHybrid/apps/application-bell-bedtime/ApplicationBellBedtime.cpp
M products/BellHybrid/apps/application-bell-bedtime/include/application-bell-bedtime/ApplicationBellBedtime.hpp
M products/BellHybrid/apps/application-bell-bedtime/windows/BellBedtimeWindow.cpp
M products/BellHybrid/apps/application-bell-main/presenters/StateController.hpp
M products/BellHybrid/apps/application-bell-main/windows/BellBatteryStatusWindow.cpp
M products/BellHybrid/apps/application-bell-main/windows/BellMainMenuWindow.cpp
M products/BellHybrid/apps/application-bell-meditation-timer/ApplicationBellMeditationTimer.cpp
M products/BellHybrid/apps/application-bell-meditation-timer/include/application-bell-meditation-timer/ApplicationBellMeditationTimer.hpp
M products/BellHybrid/apps/application-bell-powernap/ApplicationBellPowerNap.cpp
M products/BellHybrid/apps/application-bell-powernap/include/application-bell-powernap/ApplicationBellPowerNap.hpp
M products/BellHybrid/apps/application-bell-settings/ApplicationBellSettings.cpp
M products/BellHybrid/apps/application-bell-settings/include/application-bell-settings/ApplicationBellSettings.hpp
M products/BellHybrid/apps/application-bell-settings/windows/advanced/BellSettingsAdvancedWindow.cpp
M products/BellHybrid/apps/common/CMakeLists.txt
D products/BellHybrid/apps/common/include/common/data/BellFinishedCallbackWindowSwitchData.hpp
M products/BellHybrid/apps/common/include/common/data/BellFinishedWindowSwitchData.hpp
D products/BellHybrid/apps/common/include/common/windows/BellFinishedCallbackWindow.hpp
M products/BellHybrid/apps/common/include/common/windows/BellFinishedWindow.hpp
M products/BellHybrid/apps/common/src/AlarmModel.cpp
M products/BellHybrid/apps/common/src/popups/AlarmActivatedWindow.cpp
M products/BellHybrid/apps/common/src/popups/AlarmDeactivatedWindow.cpp
M products/BellHybrid/apps/common/src/popups/BedtimeNotificationWindow.cpp
D products/BellHybrid/apps/common/src/windows/BellFinishedCallbackWindow.cpp
M products/BellHybrid/apps/common/src/windows/BellFinishedWindow.cpp
M products/PurePhone/CMakeLists.txt
M third-party/usb_stack
M Jenkinsfile => Jenkinsfile +11 -2
@@ 30,6 30,7 @@ pipeline {
        JOBS=15
        PATH="/usr/local/cmake-3.21.3-linux-x86_64/bin:/usr/local/gcc-arm-none-eabi-10-2020-q4-major/bin:$PATH"
    }

    stages {
        stage('Check for previous running builds') {
            steps {


@@ 142,7 143,11 @@ pipeline {
                XDG_CACHE_HOME="/clang-cache"

            }

            when {
                expression {
                 return !(env.CHANGE_TARGET ==~ /release\/[0-9]+\.[0-9]+\.[0-9]+-bell/)
                 }
            }
            steps {
                echo "Check if branch needs rebasing"
                sh '''#!/bin/bash -e


@@ 226,7 231,11 @@ pipeline {
                CCACHE_DIR="/ccache/Linux"
                XDG_CACHE_HOME="/clang-cache"
            }

            when {
                expression {
                 return !(env.CHANGE_TARGET ==~ /release\/[0-9]+\.[0-9]+\.[0-9]+-pure/)
                 }
            }
            steps {
                echo "Check if branch needs rebasing"
                sh '''#!/bin/bash -e

M Target_RT1051.cmake => Target_RT1051.cmake +6 -0
@@ 57,6 57,12 @@ add_compile_options(
        $<$<COMPILE_LANGUAGE:CXX>:-Wno-literal-suffix>
)

set(TARGET_SOURCES

        ${CMAKE_CURRENT_LIST_DIR}/module-os/board/rt1051/_exit.c
        CACHE INTERNAL ""
)

# where is the target environment
SET(CMAKE_FIND_ROOT_PATH  ${TOOLCHAIN_PATH}/${TOOLCHAIN_PREFIX})
# search for programs in the build host directories

M image/assets/lang/Deutsch.json => image/assets/lang/Deutsch.json +9 -8
@@ 28,6 28,7 @@
  "common_stop": "STOPPEN",
  "common_resume": "FORTFAHREN",
  "common_pause": "PAUSIEREN",
  "common_play": "SPIEL",
  "common_retry": "NOCHMAL VERSUCHEN",
  "common_abort": "ABBRECHEN",
  "common_connect": "VERBINDEN",


@@ 183,7 184,6 @@
  "app_calllog_delete_call_confirmation": "Diesen Anruf aus der Liste löschen?",
  "app_calllog_no_calls": "Noch keine Anrufe.",
  "app_phonebook_no_contacts": "Noch keine Kontakte.<p>Drücken Sie <b>Pfeil nach links</b>, um neue hinzuzufügen.</p>",
  "tethering_enable_question": "Sie sind mit dem Computer verbunden.<br />Tethering aktivieren?<br /><text color='5'>(einige Funktionen können deaktiviert sein)</text>",
  "app_music_player_artists": "<text color='9'>Künstler</text>",
  "app_music_player_albums": "<text color='9'>Alben</text>",
  "app_music_player_playlists": "<text color='9'>Wiedergabelisten</text>",


@@ 191,7 191,7 @@
  "app_music_player_uknown_artist": "Unbekannter Künstler",
  "app_music_player_music_library_window_name": "Musikbibliothek",
  "app_music_player_empty_track_notification": "<text color='5'>Bitte wählen Sie einen Song aus der Bibliothek</text>",
  "app_music_player_start_window_notification": "<text color='5'>Drücken Sie den <b>Pfeil nach unten</b>, um<br></br>einen Song aus der Bibliothek auszuwählen</text>",
  "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Ü",


@@ 330,7 330,7 @@
  "app_messages_thread_not_sent": "Nicht gesendet: ",
  "app_messages_thread_you": "Sie: ",
  "app_onboarding_title": "Einführung",
  "app_onboarding_start_configuration": "<text font='gt_pressura' weight='light' size='46'><p>Hallo!</p></text><br></br><text font='gt_pressura' weight='regular' size='27'>Konfigurieren wir gemeinsam Ihr Mudita Pure.</text>",
  "app_onboarding_start_configuration": "<text font='gt_pressura' weight='light' size='46'><p>Hallo!</p></text><br></br><text font='gt_pressura' weight='regular' size='27'>Konfigurieren wir gemeinsam Ihr <br></br> Mudita Pure.</text>",
  "app_onboarding_eula_license": "Lizenzvereinbarung (EULA)",
  "app_onboarding_select_sim": "Aktive SIM auswählen",
  "app_onboarding_select_sim_description": "<text>Es kann immer nur eine SIM-Karte aktiv sein.<br></br>Sie können diese jetzt auswählen und bei Bedarf<br></br>in den Einstellungen wechseln.</text>",


@@ 424,7 424,7 @@
  "app_settings_security": "Sicherheit",
  "app_settings_language": "Sprache",
  "app_settings_factory_reset": "Auf Werkseinstellung zurücksetzen",
  "app_settings_display_factory_reset_confirmation": "Das Telefon muss ausgeschaltet werden, \num es auf die Werkseinstellungen zurückzusetzen.\n Jetzt neu starten?",
  "app_settings_display_factory_reset_confirmation": "Sie müssen Ihren Pure neu starten \num den Werksreset abzuschließen.\n Handy jetzt ausschalten?",
  "app_settings_about_your_pure": "Über Ihr Pure",
  "app_settings_technical_information": "Technische Informationen",
  "app_settings_tech_info_model": "Modell",


@@ 443,6 443,7 @@
  "app_settings_sar": "SAR",
  "app_settings_about": "Über Mudita Pure",
  "app_settings_title_languages": "Sprachauswahl",
  "app_settings_network_sim_cards": "SIM-Karten",
  "app_settings_network_active_card": "Aktive Karte",
  "app_settings_network_operator_auto_select": "Automatische Auswahl",
  "app_settings_network_all_operators": "Alle Bediener",


@@ 506,11 507,11 @@
  "app_settings_notifications_when_locked": "Benachrichtigen bei Sperre",
  "app_settings_calls_from_favorites": "Anrufe von Favoriten",
  "app_settings_allow": "Erlauben",
  "app_settings_no_network_connection_flight_mode": "Keine Netzwerkverbindung (Flugmodus)",
  "app_settings_no_network_connection_flight_mode": "Flugmodus",
  "app_settings_messages_only": "Nur Nachrichten",
  "app_settings_info_dnd": "In diesem Modus kann Pure alle Benachrichtigungen stumm empfangen. Sie können Benachrichtigungen zulassen, wenn Ihre Favoriten-Kontakte Sie anrufen.",
  "app_settings_info_offline_flight_mode": "In diesem Modus wird Ihr Pure vollständig vom Netz getrennt. Sie können ihn sicher als Flugmodus verwenden. Anrufe, Nachrichten und Tethering sind nicht verfügbar.",
  "app_settings_info_offline_messages_only": "Das Pure meldet sich im Netzwerk an, um Nachrichten zu senden und herunterzuladen, je nach Verbindungshäufigkeit. Anrufe und Tethering sind nicht verfügbar.",
  "app_settings_info_dnd": "Alle Benachrichtigungen stumm erhalten. Sie können vollständige Benachrichtigungen von bevorzugten Kontakten zulassen.",
  "app_settings_info_offline_flight_mode": "Vollständig getrennt. Anrufe, Nachrichten und Tethering sind nicht verfügbar.",
  "app_settings_info_offline_messages_only": "Nachrichten basierend auf Verbindungsintervallen senden und herunterladen. Keine Anrufe oder Tethering.",
  "app_phonebook_title_main": "Kontakte",
  "common_search_uc": "Suchen",
  "common_search_results": "Suchergebnisse",

M image/assets/lang/English.json => image/assets/lang/English.json +5 -6
@@ 26,7 26,6 @@
  "common_uncheck": "UNCHECK",
  "common_emoji": "EMOJI",
  "common_special_characters": "SPECIAL",
  "common_play": "PLAY",
  "common_start": "START",
  "common_stop": "STOP",
  "common_resume": "RESUME",


@@ 393,7 392,7 @@
  "app_settings_security": "Security",
  "app_settings_language": "Language",
  "app_settings_factory_reset": "Factory reset",
  "app_settings_display_factory_reset_confirmation": "Your phone needs to turn off \nto perform factory reset.\n Restart now?",
  "app_settings_display_factory_reset_confirmation": "You need to restart your Pure \nto finalize factory reset.\n Turn off the phone now?",
  "app_settings_about_your_pure": "About your Pure",
  "app_settings_technical_information": "Technical Information",
  "app_settings_tech_info_model": "Model",


@@ 482,11 481,11 @@
  "app_settings_notifications_when_locked": "Notifications when locked",
  "app_settings_calls_from_favorites": "Calls from favorites",
  "app_settings_allow": "Allow",
  "app_settings_no_network_connection_flight_mode": "No network connection (flight mode)",
  "app_settings_no_network_connection_flight_mode": "Flight mode",
  "app_settings_messages_only": "Messages only",
  "app_settings_info_dnd": "This mode enables Pure to silently receive all notifications. You can allow notifications when favorite contacts call you.",
  "app_settings_info_offline_flight_mode": "This mode causes your Pure to be fully disconnected. You can safely use it as flight mode. Calls, messages and tethering are unavailable.",
  "app_settings_info_offline_messages_only": "Pure will log into the network to send and download messages based on connection frequency. Calls and tethering are unavailable.",
  "app_settings_info_dnd": "Silently receive all notifications. You can allow full notifications from favorite contacts.",
  "app_settings_info_offline_flight_mode": "Fully disconnected. Calls, messages and tethering are unavailable.",
  "app_settings_info_offline_messages_only": "Send and download messages based on connection intervals. No calls nor tethering.",
  "app_phonebook_title_main": "Contacts",
  "common_search_uc": "Search",
  "common_search_results": "Search results",

M image/assets/lang/Espanol.json => image/assets/lang/Espanol.json +8 -7
@@ 28,6 28,7 @@
  "common_stop": "DETENER",
  "common_resume": "REANUDAR",
  "common_pause": "PAUSA",
  "common_play": "REPRODUCIR",
  "common_retry": "REINTENTAR",
  "common_abort": "ANULAR",
  "common_connect": "CONECTAR",


@@ 183,7 184,6 @@
  "app_calllog_delete_call_confirmation": "¿Eliminar esta llamada de la lista?",
  "app_calllog_no_calls": "Aún no hay llamadas.",
  "app_phonebook_no_contacts": "Aún no hay contactos. <p> Presiona la <b> flecha izquierda </b> para agregar nuevos. </p>",
  "tethering_enable_question": "Estás conectado a la computadora. <br /> ¿Activar el tethering? <br /> <text color = '5'> (algunas funciones pueden estar deshabilitadas) </text>",
  "app_music_player_artists": "<text color = '9'> Artistas </text>",
  "app_music_player_albums": "<text color = '9'> Álbumes </text>",
  "app_music_player_playlists": "<text color = '9'> Listas de reproducción </text>",


@@ 191,7 191,7 @@
  "app_music_player_uknown_artist": "Artista desconocido",
  "app_music_player_music_library_window_name": "Biblioteca de música",
  "app_music_player_empty_track_notification": "<text color = '5'> Elige una canción de la biblioteca </text>",
  "app_music_player_start_window_notification": "<text color = '5'> Presiona la <b> flecha hacia abajo </b> para elegir <br> </br> una canción de la biblioteca </text>",
  "app_music_player_start_window_notification": "<text color = '5'> Presiona la <b>abajo</b> para elegir <br> </br> una canción </text>",
  "app_desktop_unlock": "DESBLOQUEAR",
  "app_desktop_menu": "MENÚ",
  "app_desktop_emergency": "SOS",


@@ 423,7 423,7 @@
  "app_settings_security": "Seguridad",
  "app_settings_language": "Idioma",
  "app_settings_factory_reset": "Configuración de fábrica",
  "app_settings_display_factory_reset_confirmation": "Debes apagar el teléfono \npara restablecer la configuración de fábrica.\n ¿Reiniciar ahora?",
  "app_settings_display_factory_reset_confirmation": "Necesita reiniciar su Pure \npara finalizar el reinicio de fábrica.\n ¿Apagar el teléfono ahora?",
  "app_settings_about_your_pure": "Mi dispositivo Pure",
  "app_settings_technical_information": "Información técnica",
  "app_settings_tech_info_model": "Modelo",


@@ 442,6 442,7 @@
  "app_settings_sar": "TAE",
  "app_settings_about": "Sobre Mudita Pure",
  "app_settings_title_languages": "Selección de idioma",
  "app_settings_network_sim_cards": "Tarjetas SIM",
  "app_settings_network_active_card": "Tarjeta activa",
  "app_settings_network_operator_auto_select": "Selección automática de operador",
  "app_settings_network_all_operators": "Todos los operadores",


@@ 506,11 507,11 @@
  "app_settings_notifications_when_locked": "Notificaciones cuando esté bloqueado",
  "app_settings_calls_from_favorites": "Llamadas de favoritos",
  "app_settings_allow": "Permitir",
  "app_settings_no_network_connection_flight_mode": "Sin conexión de red (modo avión)",
  "app_settings_no_network_connection_flight_mode": "Modo avión",
  "app_settings_messages_only": "Solo mensajes",
  "app_settings_info_dnd": "Este modo permite que Pure reciba todas las notificaciones en silencio. Puedes permitir las notificaciones al recibir llamadas de tus contactos favoritos.",
  "app_settings_info_offline_flight_mode": "Este modo hace que tu Pure se desconecte por completo. Puedes usarlo de forma segura en modo avión. Las llamadas, los mensajes y el anclaje de red no están disponibles.",
  "app_settings_info_offline_messages_only": "Pure se conectará a la red para enviar y descargar mensajes en función de la frecuencia de conexión. Las llamadas y el anclaje de red no están disponibles.",
  "app_settings_info_dnd": "Recibe todas las notificaciones en silencio. Puedes permitir notificaciones completas de tus contactos favoritos.",
  "app_settings_info_offline_flight_mode": "Completamente desconectado. Las llamadas, los mensajes y la conexión no están disponibles.",
  "app_settings_info_offline_messages_only": "Envía y descarga mensajes según los intervalos de conexión. Sin llamadas ni conexión.",
  "app_phonebook_title_main": "Contactos",
  "common_search_uc": "Buscar",
  "common_search_results": "Buscar resultados",

M image/assets/lang/Francais.json => image/assets/lang/Francais.json +9 -7
@@ 28,6 28,7 @@
  "common_stop": "ARRÊTER",
  "common_resume": "REPRENDRE",
  "common_pause": "ARRÊTER",
  "common_play": "JOUER",
  "common_retry": "ESSAYER DE NOUVEAU",
  "common_abort": "ANNULER",
  "common_connect": "CONNECTER",


@@ 152,7 153,6 @@
  "app_calllog_delete_call_confirmation": "Supprimer cet appel de la liste?",
  "app_calllog_no_calls": "Pas encore d'appels.",
  "app_phonebook_no_contacts": "Aucun contact pour le moment.<p>Appuyez sur la <b>flèche gauche</b> pour en ajouter un nouveau.</p>",
  "tethering_enable_question": "Vous êtes connecté à l'ordinateur.<br />Activer le partage de connexion ?<br /><text color='5'>(certaines fonctions peuvent être désactivées)</text>",
  "app_music_player_artists": "<text color='9'>Artistes</text>",
  "app_music_player_albums": "<text color='9'>Albums</text>",
  "app_music_player_playlists": "<text color='9'>Listes de lecture</text>",


@@ 160,7 160,7 @@
  "app_music_player_uknown_artist": "Artiste inconnu",
  "app_music_player_music_library_window_name": "Bibliothèque musicale",
  "app_music_player_empty_track_notification": "<text color='5'>Veuillez choisir une chanson dans la bibliothèque</text>",
  "app_music_player_start_window_notification": "<text color='5'>Appuyez sur la <b>flèche vers le bas</b> pour choisir<br></br> une chanson de la bibliothèque</text>",
  "app_music_player_start_window_notification": "<text color='5'>Appuyez sur <b>le bas</b> pour choisir<br></br> une chanson</text>",
  "app_desktop_unlock": "DÉVÉROUILLER",
  "app_desktop_menu": "MENU",
  "app_desktop_emergency": "URGENCE",


@@ 391,7 391,7 @@
  "app_settings_security": "Sécurité",
  "app_settings_language": "Langues",
  "app_settings_factory_reset": "Retour aux paramètres d'usine",
  "app_settings_display_factory_reset_confirmation": "Votre téléphone doit s'éteindre\npour effectuer la réinitialisation d'usine.\nRedémarrer maintenant ?",
  "app_settings_display_factory_reset_confirmation": "Il faut redémarrer votre Pure\npour finaliser la réinitialisation d'usine.\nÉteindre le téléphone maintenant?",
  "app_settings_about_your_pure": "À propos de votre Pure",
  "app_settings_technical_information": "Informations techniques",
  "app_settings_tech_info_model": "Modèle",


@@ 410,6 410,7 @@
  "app_settings_sar": "SAR",
  "app_settings_about": "À propos de Mudita Pure",
  "app_settings_title_languages": "Sélection de langue",
  "app_settings_network_sim_cards": "Cartes SIM",
  "app_settings_network_active_card": "Activer la carte",
  "app_settings_network_operator_auto_select": "Operator auto-select",
  "app_settings_network_all_operators": "All operators",


@@ 473,11 474,12 @@
  "app_settings_notifications_when_locked": "Notifications lorsque verrouillé",
  "app_settings_calls_from_favorites": "Appels des favoris",
  "app_settings_allow": "Permettre",
  "app_settings_no_network_connection_flight_mode": "Pas de connexion réseau (mode avion)",
  "app_settings_no_network_connection_flight_mode": "Mode avion",
  "app_settings_messages_only": "Messages seulement",
  "app_settings_info_dnd": "Ce mode permet à Pure de recevoir silencieusement toutes les notifications. Vous pouvez autoriser les notifications lorsque vos contacts favoris vous appellent.",
  "app_settings_info_offline_flight_mode": "Ce mode entraîne la déconnexion complète de votre Pure. Vous pouvez l'utiliser en toute sécurité comme mode avion. Les appels, les messages et le partage de connexion ne sont pas disponibles.",
  "app_settings_info_offline_messages_only": "Pure se connectera au réseau pour envoyer et télécharger des messages en fonction de la fréquence de connexion. Les appels et le partage de connexion ne sont pas disponibles.",  "app_phonebook_title_main": "Contacts",
  "app_settings_info_dnd": "Recevez toutes les notifications en silence. Vous pouvez autoriser les notifications complètes de vos contacts favoris.",
  "app_settings_info_offline_flight_mode": "Complètement déconnecté. Les appels, les messages et le partage de connexion ne sont pas disponibles.",
  "app_settings_info_offline_messages_only": "Envoyer et télécharger des messages en fonction des intervalles de connexion. Pas d'appels ni de partage de connexion.",
  "app_phonebook_title_main": "Contacts",
  "common_search_uc": "Rechercher",
  "common_search_results": "Résultats de recherche",
  "app_phonebook_search_no_results": "Aucun contact trouvé.",

M image/assets/lang/Polski.json => image/assets/lang/Polski.json +16 -16
@@ 28,7 28,7 @@
  "common_stop": "STOP",
  "common_resume": "WZNÓW",
  "common_pause": "PAUZA",
  "common_play_pause": "ODTWÓRZ/PAUZUJ",
  "common_play": "GRAJ",
  "common_retry": "SPRÓBUJ PONOWNIE",
  "common_abort": "ZREZYGNUJ",
  "common_connect": "POŁĄCZ SIĘ",


@@ 176,16 176,15 @@
  "app_calllog_no_calls": "<text align='center' color='5'>Brak połączeń.</text>",
  "app_calllog_type": "Połączenie",
  "app_calllog_duration": "Czas trwania",
  "app_calllog_incoming_call": "Połączenie odebrane",
  "app_calllog_outgoing_call": "Połączenie wykonane",
  "app_calllog_missed_call": "Nieodebrane połączenie",
  "app_calllog_rejected_call": "Odrzucone połączenie",
  "app_calllog_incoming_call": "Odebrane",
  "app_calllog_outgoing_call": "Wykonane",
  "app_calllog_missed_call": "Nieodebrane",
  "app_calllog_rejected_call": "Odrzucone",
  "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>",
  "tethering_enable_question": "Jesteś podłączony do komputera.<br />Włączyć tethering?<br /><text color='5'>(niektóre funkcje mogą być wyłączone)</text>",
  "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>",


@@ 302,7 301,7 @@
  "app_call_reject": "ODRZUĆ",
  "app_call_answer": "ODBIERZ",
  "app_call_message": "WIADOMOŚĆ",
  "app_call_end_call": "ZAKOŃCZ POŁĄCZENIE",
  "app_call_end_call": "ZAKOŃCZ",
  "app_call_emergency": "Połączenie alarmowe",
  "app_call_is_calling": "dzwoni",
  "app_call_calling": "dzwoni…",


@@ 312,7 311,7 @@
  "app_call_mute": "WYCISZ",
  "app_call_muted": "WYCISZONE",
  "app_call_speaker": "GŁOŚNIK",
  "app_call_speaker_on": "GŁOŚNIK WŁĄCZONY",
  "app_call_speaker_on": "GŁOŚNIK",
  "app_call_bluetooth": "BLUETOOTH",
  "app_call_no_sim": "Brak SIM.\n\nAby wykonać połączenie,\nwłóż kartę SIM.",
  "app_call_offline": "Jesteś w trybie offline.\n\nAby wykonać połączenie,\n przejdź w tryb Połączony.",


@@ 331,7 330,7 @@
  "app_messages_thread_not_sent": "Niewysłane: ",
  "app_messages_thread_you": "Ty: ",
  "app_onboarding_title": "Wprowadzenie",
  "app_onboarding_start_configuration": "<text font='gt_pressura' weight='light' size='46'><p>Witaj!</p></text><br></br><text font='gt_pressura' weight='regular' size='27'>Skonfigurujmy twój telefon Mudita Pure.</text>",
  "app_onboarding_start_configuration": "<text font='gt_pressura' weight='light' size='46'><p>Witaj!</p></text><br></br><text font='gt_pressura' weight='regular' size='27'>Skonfigurujmy twój telefon <br></br> Mudita Pure.</text>",
  "app_onboarding_eula_license": "Umowa licencyjna (EULA)",
  "app_onboarding_select_sim": "Wybierz aktywną kartę SIM",
  "app_onboarding_select_sim_description": "<text>Tylko jedna karta SIM może być jednocześnie aktywna.<br></br>Możesz ją wybrać teraz i zmienić<br></br>w razie potrzeby w Ustawieniach.</text>",


@@ 342,7 341,7 @@
  "app_onboarding_skip_confirm": "<text>Do połączenia z siecią konieczna jest konfiguracja karty SIM. Pominąć konfigurację mimo to? </text>",
  "app_onboarding_configuration_successful": "<text>Twój telefon Mudita Pure<br></br>jest gotowy do użycia.</text>",
  "app_onboarding_no_configuration": "<text>Twój telefon Mudita Pure nie został<br></br>skonfigurowany. Możesz przejść do<br></br>Ustawień, by go skonfigurować.</text>",
  "app_onboarding_update_info": "<text>Aktualna wersja MuditaOS to <br></br> <token>$VERSION</token>. Aktualizacje z nowymi <br></br> funkcjami i poprawkami pojawiają się regularnie. <br></br>Aby zaktualizować telefon, <br></br> odwiedź stronę: </text><text font='gt_pressura' weight='bold' size='27'>www.mudita.com/updateos</text><br></br><text>i postępuj zgodnie ze wskazówkami.</text>",
  "app_onboarding_update_info": "<text>Aktualna wersja MuditaOS to <token>$VERSION</token>.<br></br>Aktualizacje z nowymi funkcjami i poprawkami pojawiają się regularnie. Aby zaktualizować telefon, odwiedź stronę: <br></br> </text><text font='gt_pressura' weight='bold' size='27'>www.mudita.com/updateos</text><br></br><text>i postępuj zgodnie ze wskazówkami.</text>",
  "app_settings_title_main": "Ustawienia",
  "app_settings_advanced": "Zaawansowane",
  "app_settings_bt": "Bluetooth",


@@ 425,7 424,7 @@
  "app_settings_security": "Bezpieczeństwo",
  "app_settings_language": "Język",
  "app_settings_factory_reset": "Ustawienia fabryczne",
  "app_settings_display_factory_reset_confirmation": "Wyłącz telefon, \nby przywrócić ustawienia fabryczne.\nUruchomić ponownie teraz?",
  "app_settings_display_factory_reset_confirmation": "Musisz ponownie uruchomić Pure \naby przywrócić ustawieia fabryczne.\nWyłączyć telefon?",
  "app_settings_about_your_pure": "Dane telefonu",
  "app_settings_technical_information": "Informacje techniczne",
  "app_settings_tech_info_model": "Model",


@@ 444,6 443,7 @@
  "app_settings_sar": "SAR",
  "app_settings_about": "O Mudita Pure",
  "app_settings_title_languages": "Wybór języka",
  "app_settings_network_sim_cards": "Karty SIM",
  "app_settings_network_active_card": "Aktywna karta",
  "app_settings_network_operator_auto_select": "Automatyczny wybór operatora",
  "app_settings_network_all_operators": "Wszyscy operatorzy",


@@ 507,14 507,14 @@
  "app_settings_title_offline": "Offline",
  "app_settings_title_connection_frequency": "Częstotliwość połączenia",
  "app_settings_connected": "Połączony",
  "app_settings_notifications_when_locked": "Powiadomienia przy zablokowanym ekranie",
  "app_settings_notifications_when_locked": "Alerty przy zabl. ekranie",
  "app_settings_calls_from_favorites": "Połączenia od ulubionych",
  "app_settings_allow": "Pozwalaj",
  "app_settings_no_network_connection_flight_mode": "Brak połączenia z siecią (tryb samolotowy)",
  "app_settings_no_network_connection_flight_mode": "Tryb samolotowy",
  "app_settings_messages_only": "Tylko wiadomości",
  "app_settings_info_dnd": "Odbieraj wszystkie powiadomienia po cichu. Możesz zezwolić na powiadomienia, kiedy dzwonią do Ciebie osoby z listy ulubionych kontaktów.",
  "app_settings_info_offline_flight_mode": "Jesteś całkowicie odłączony. Możesz bezpiecznie używać tego trybu jako trybu samolotowego. Połączenia, wiadomości i tethering są niedostępne.",
  "app_settings_info_offline_messages_only": "Pure loguje się do sieci, by wysyłać i pobierać wiadomości w zależności od częstotliwości połączenia. Połączenia i tethering są niedostępne.",
  "app_settings_info_dnd": "Ciche powiadomienia. Możesz zezwolić na pełne powiadomienia od ulubionych kontaktów.",
  "app_settings_info_offline_flight_mode": "Całkowicie rozłączony. Połączenia, wiadomości i tethering są niedostępne.",
  "app_settings_info_offline_messages_only": "Wysyłaj i pobieraj wiadomości na podstawie interwałów połączeń. Żadnych połączeń ani tetheringu.",
  "app_phonebook_title_main": "Kontakty",
  "common_search_uc": "Szukaj",
  "common_search_results": "Wyniki wyszukiwania",

M image/assets/lang/Svenska.json => image/assets/lang/Svenska.json +7 -5
@@ 27,6 27,7 @@
  "common_stop": "STOPPA",
  "common_resume": "FORTSÄTT",
  "common_pause": "PAUSA",
  "common_play": "SPELA",
  "common_mo": "MÅ",
  "common_tu": "TI",
  "common_we": "ON",


@@ 137,7 138,6 @@
  "app_calllog_delete_call_confirmation": "Ta bort det här samtalet från listan?",
  "app_calllog_no_calls": "Inga samtal ännu.",
  "app_phonebook_no_contacts": "Inga kontakter ännu.<p>Tryck på <b>vänsterpil</b> för att lägga till nya.</p>",
  "tethering_enable_question": "Du är ansluten till datorn.<br />Slå på internetdelning?<br /><text color='5'>(vissa funktioner kan vara inaktiverade)</text>",
  "app_music_player_artists": "<text color='9'>Artister</text>",
  "app_music_player_albums": "<text color='9'>Album</text>",
  "app_music_player_playlists": "<text color='9'>Spellistor</text>",


@@ 340,6 340,7 @@
  "app_settings_security": "Säkerhet",
  "app_settings_language": "Språk",
  "app_settings_factory_reset": "Fabriksinställningar",
  "app_settings_display_factory_reset_confirmation": "Du måste starta om din Pure\nslutföra fabriksåterställningen.\nStänga av telefonen nu?",
  "app_settings_about_your_pure": "Om din Pure",
  "app_settings_technical_information": "Teknisk information",
  "app_settings_tech_info_model": "Model",


@@ 353,6 354,7 @@
  "app_settings_sar": "SAR",
  "app_settings_about": "Om Mudita Pure",
  "app_settings_title_languages": "Språkval",
  "app_settings_network_sim_cards": "SIM-kort",
  "app_settings_network_active_card": "Aktivt kort",
  "app_settings_network_operator_auto_select": "Välj operatör automatiskt",
  "app_settings_network_all_operators": "Alla operatörer",


@@ 381,11 383,11 @@
  "app_settings_notifications_when_locked": "Meddelanden när de är låsta",
  "app_settings_calls_from_favorites": "Samtal från favoriter",
  "app_settings_allow": "Tillåt",
  "app_settings_no_network_connection_flight_mode": "Ingen nätverksanslutning (flygläge)",
  "app_settings_no_network_connection_flight_mode": "Flygläge",
  "app_settings_messages_only": "Endast meddelanden",
  "app_settings_info_dnd": "Med det här läget kan Pure tyst ta emot alla aviseringar. Du kan tillåta aviseringar när favoritkontakter ringer dig.",
  "app_settings_info_offline_flight_mode": "Detta läge gör att din Pure kopplas ur helt. Du kan säkert använda den som flygläge. Samtal, meddelanden och internetdelning är inte tillgängliga.",
  "app_settings_info_offline_messages_only": "Pure loggar in i nätverket för att skicka och ladda ner meddelanden baserat på anslutningsfrekvens. Samtal och internetdelning är inte tillgängliga.",
  "app_settings_info_dnd": "Ta emot alla aviseringar tyst. Du kan tillåta fullständiga aviseringar från favoritkontakter.",
  "app_settings_info_offline_flight_mode": "Helt frånkopplad. Samtal, meddelanden och internetdelning är inte tillgängliga.",
  "app_settings_info_offline_messages_only": "Skicka och ladda ner meddelanden baserat på anslutningsintervall. Inga samtal eller internetdelning.",
  "app_settings_toggle_on": "PÅ",
  "app_settings_toggle_off": "AV",
  "app_settings_security_phone_lock": "Lösenord för att låsa telefonen",

M module-apps/application-onboarding/style/OnBoardingStyle.hpp => module-apps/application-onboarding/style/OnBoardingStyle.hpp +5 -0
@@ 7,6 7,11 @@

namespace style::onboarding
{
    namespace start_configuration
    {
        inline constexpr auto image_top_margin = 15U;
    } // namespace start_configuration

    namespace sim_select
    {
        inline constexpr auto description_y           = 400;

M module-apps/application-onboarding/windows/StartConfigurationWindow.cpp => module-apps/application-onboarding/windows/StartConfigurationWindow.cpp +10 -7
@@ 5,6 5,7 @@

#include <application-onboarding/ApplicationOnBoarding.hpp>
#include <application-onboarding/data/OnBoardingSwitchData.hpp>
#include <application-onboarding/style/OnBoardingStyle.hpp>

#include <apps-common/windows/DialogMetadata.hpp>
#include <apps-common/messages/DialogMetadataMessage.hpp>


@@ 32,13 33,15 @@ namespace app::onBoarding
        navBar->setText(gui::nav_bar::Side::Right, utils::translate(::style::strings::common::back));
        navBar->setText(gui::nav_bar::Side::Left, utils::translate(::style::strings::common::skip));

        new gui::Icon(this,
                      0,
                      0,
                      style::window_width,
                      style::window::default_body_height,
                      "logo_no_text",
                      utils::translate("app_onboarding_start_configuration"));
        auto icon = new gui::Icon(this,
                                  style::window::default_left_margin,
                                  style::window::default_vertical_pos,
                                  style::window::default_body_width,
                                  style::window::default_body_height,
                                  "logo_no_text",
                                  utils::translate("app_onboarding_start_configuration"));
        icon->image->setMargins({0, style::onboarding::start_configuration::image_top_margin, 0, 0});
        icon->setAlignment(gui::Alignment(gui::Alignment::Horizontal::Center, gui::Alignment::Vertical::Top));
    }

    gui::status_bar::Configuration StartConfigurationWindow::configureStatusBar(

M module-audio/Audio/Profiles/ProfileRoutingLoudspeaker.hpp => module-audio/Audio/Profiles/ProfileRoutingLoudspeaker.hpp +8 -6
@@ 9,12 9,14 @@ namespace audio

    class ProfileRoutingLoudspeaker : public Profile
    {
        static constexpr uint32_t sampleRate = 16000;

      public:
        ProfileRoutingLoudspeaker(Volume volume, Gain gain)
            : Profile("Routing Speakerphone",
                      Type::RoutingLoudspeaker,
                      audio::codec::Configuration{
                          .sampleRate_Hz = 16000,
                          .sampleRate_Hz = sampleRate,
                          .bitWidth      = 16,
                          .flags         = static_cast<uint32_t>(
                                       audio::codec::Flags::InputLeft) | // microphone use left audio channel


@@ 25,15 27,15 @@ namespace audio
                          .outputPath   = audio::codec::OutputPath::Loudspeaker,
                          .filterCoefficients =
                              {qfilter_CalculateCoeffs(
                                   audio::equalizer::FilterType::FilterHighPass, 997.f, 44100, 0.701f, 0),
                                   audio::equalizer::FilterType::FilterHighPass, 307.3f, sampleRate, 0.701f, 0),
                               qfilter_CalculateCoeffs(
                                   audio::equalizer::FilterType::FilterLowPass, 4993.7f, 44100, 0.701f, 0),
                                   audio::equalizer::FilterType::FilterLowPass, 5080.1f, sampleRate, 0.847f, 0),
                               qfilter_CalculateCoeffs(
                                   audio::equalizer::FilterType::FilterNone, 15975.7f, 44100, 0.701f, -10),
                                   audio::equalizer::FilterType::FilterNone, 15975.7f, sampleRate, 0.701f, -10),
                               qfilter_CalculateCoeffs(
                                   audio::equalizer::FilterType::FilterNone, 200.4f, 44100, 0.701f, -10),
                                   audio::equalizer::FilterType::FilterNone, 200.4f, sampleRate, 0.701f, -10),
                               qfilter_CalculateCoeffs(
                                   audio::equalizer::FilterType::FilterNone, 1496.7f, 44100, 0.701f, -4)}},
                                   audio::equalizer::FilterType::FilterNone, 1496.7f, sampleRate, 0.701f, -4)}},
                      AudioDevice::Type::Audiocodec)
        {}
    };

M module-bsp/board/rt1051/bsp/audio/CodecMAX98090.cpp => module-bsp/board/rt1051/bsp/audio/CodecMAX98090.cpp +2 -2
@@ 175,8 175,8 @@ CodecRetCode CodecMAX98090::Start(const CodecParams &param)
            i2cAddr.subAddress                       = MAX98090_REG_OUTPUT_ENABLE;
            i2c->Write(i2cAddr, (uint8_t *)&outputenable, 1);

            constexpr uint8_t coarse = 1;
            constexpr uint8_t fine   = 0;
            constexpr uint8_t coarse = 0;
            constexpr uint8_t fine   = 5;
            SetPlaybackPath(coarse, fine);
            SetFilterMode(FilterMode::Voice);
        } break;

M module-bsp/board/rt1051/bsp/eMMC/fsl_mmc.c => module-bsp/board/rt1051/bsp/eMMC/fsl_mmc.c +25 -2
@@ 1865,7 1865,11 @@ static status_t MMC_Write(
    }

    /* Wait for the card's buffer to be not full to write to improve the write performance. */
    while ((GET_SDMMCHOST_STATUS(card->host.base) & CARD_DATA0_STATUS_MASK) != CARD_DATA0_NOT_BUSY) {}
    error = MMC_PollingCardStatusBusy(card);
    if(kStatus_Success != error)
    {
        return error;
    }

    /* Wait for the card write process complete */
    if (kStatus_Success != MMC_WaitWriteComplete(card)) {


@@ 2264,7 2268,11 @@ status_t MMC_EraseGroups(mmc_card_t *card, uint32_t startGroup, uint32_t endGrou
    }

    /* Wait for the card's buffer to be not full to write to improve the write performance. */
    while ((GET_SDMMCHOST_STATUS(card->host.base) & CARD_DATA0_STATUS_MASK) != CARD_DATA0_NOT_BUSY) {}
    status_t error = MMC_PollingCardStatusBusy(card);
    if(kStatus_Success != error)
    {
        return error;
    }

    if (kStatus_Success != MMC_WaitWriteComplete(card)) {
        return kStatus_SDMMC_WaitWriteCompleteFailed;


@@ 2631,3 2639,18 @@ status_t MMC_StopBoot(mmc_card_t *card, uint32_t bootMode)

    return kStatus_Success;
}

status_t MMC_PollingCardStatusBusy(mmc_card_t *card)
{
    int retries = 0;
    const int maxRetries = 10000;
    do {
        if ((GET_SDMMCHOST_STATUS(card->host.base) & CARD_DATA0_STATUS_MASK) == CARD_DATA0_NOT_BUSY) {
            return kStatus_Success;
        }
        // yeld 
        SDMMCHOST_Delay(0);
    } while (retries++ < maxRetries);
    
    return kStatus_SDMMC_PollingCardIdleFailed;
}

M module-bsp/board/rt1051/bsp/eMMC/fsl_mmc.h => module-bsp/board/rt1051/bsp/eMMC/fsl_mmc.h +12 -0
@@ 356,6 356,18 @@ extern "C"
     */
    status_t MMC_SetMaxEraseUnitSize(mmc_card_t *card);

    /*!
     * @brief Polling card idle status.
     *
     * This function can be used to poll the status from busy to idle.
     *
     * @param card Card descriptor.
     *
     * @retval kStatus_SDMMC_TransferFailed Command tranfer failed.
     * @retval kStatus_Success Operate successfully.
     */
    status_t MMC_PollingCardStatusBusy(mmc_card_t *card);

/* @} */
#if defined(__cplusplus)
}

M module-bsp/board/rt1051/bsp/eMMC/fsl_sdmmc_common.h => module-bsp/board/rt1051/bsp/eMMC/fsl_sdmmc_common.h +1 -0
@@ 124,6 124,7 @@ enum _sdmmc_status
    kStatus_SDMMC_CardDetectFailed         = MAKE_STATUS(kStatusGroup_SDMMC, 39U), /*!<  card detect failed */
    kStatus_SDMMC_PartitioningFailed       = MAKE_STATUS(kStatusGroup_SDMMC, 40U), /*!<  Partitioning failed */
    kStatus_SDMMC_PartitioningNotSupported = MAKE_STATUS(kStatusGroup_SDMMC, 41U), /*!<  Partitioning not supported */
    kStatus_SDMMC_PollingCardIdleFailed    = MAKE_STATUS(kStatusGroup_SDMMC, 42U), /*!< polling card idle status failed */
};

/*! @brief card operation voltage */

M module-os/board/rt1051/CMakeLists.txt => module-os/board/rt1051/CMakeLists.txt +0 -1
@@ 1,7 1,6 @@
target_sources(
        module-os
    PRIVATE
        _exit.c
        fsl_tickless_gpt.c
        fsl_tickless_systick.c
        fsl_runtimestat_gpt.c

M module-os/board/rt1051/_exit.c => module-os/board/rt1051/_exit.c +8 -38
@@ 35,47 35,17 @@
#include <log/log.hpp>
#include <task.h>
#include <macros.h>
// ----------------------------------------------------------------------------

// Forward declaration

void _exit(int code);

// ----------------------------------------------------------------------------

void __reset_hardware(void)
{
    // Let watchdog reset system
    while (1)
        ;
}

// On Release, call the hardware reset procedure.
// On Debug we just enter an infinite loop, to be used as landmark when halting
// the debugger.
//
// It can be redefined in the application, if more functionality
// is required.

void __attribute__((weak)) _exit(int code)
void __attribute__((noreturn, used)) _exit(int code)
{
    LOG_FATAL("_exit %d", code);
    LOG_INFO("_exit %d", code);
    haltIfDebugging();
    vTaskEndScheduler();
#ifdef DEBUG
    while (1) {};
    NVIC_SystemReset();
    // waiting for system reset
    while (1) {
#ifndef DEBUG
        __asm volatile("wfi\n");
#endif
    };
}

// ----------------------------------------------------------------------------

#if 0
void
__attribute__((weak))
abort(void)
{

}
#endif

// ----------------------------------------------------------------------------

M module-platform/rt1051/src/disk_emmc.cpp => module-platform/rt1051/src/disk_emmc.cpp +3 -2
@@ 105,8 105,9 @@ namespace purefs::blkdev
            return statusBlkDevFail;
        }
        // Wait for the card's buffer to become empty
        while ((GET_SDMMCHOST_STATUS(mmcCard->host.base) & CARD_DATA0_STATUS_MASK) != CARD_DATA0_NOT_BUSY) {
            taskYIELD();
        auto error = MMC_PollingCardStatusBusy(mmcCard.get());
        if (kStatus_Success != error) {
            return error;
        }
        if (pmState == pm_state::suspend) {
            driverUSDHC->Enable();

M module-services/service-desktop/BackupRestore.cpp => module-services/service-desktop/BackupRestore.cpp +16 -4
@@ 451,6 451,7 @@ std::string BackupRestore::ReadVersionFromJsonFile(const std::filesystem::path &

bool BackupRestore::CheckBackupVersion(const std::filesystem::path &extractedBackup)
{
    auto versionOK           = true;
    const auto backupVersion = ReadVersionFromJsonFile(extractedBackup / bkp::backupInfo);

    if (backupVersion.empty()) {


@@ 465,17 466,28 @@ bool BackupRestore::CheckBackupVersion(const std::filesystem::path &extractedBac
        return false;
    }

    LOG_DEBUG("Current OS version %s, backup version %s", (currentVersion).c_str(), (backupVersion).c_str());

    auto const currentVersionTokens = utils::split(currentVersion, ".");
    auto const backupVersionTokens  = utils::split(backupVersion, ".");

    if (currentVersionTokens[0] < backupVersionTokens[0] || //  major version
        currentVersionTokens[1] < backupVersionTokens[1]) { //  minor version
    if (currentVersionTokens[0] < backupVersionTokens[0]) { //  major version
        versionOK = false;
    }
    else if (currentVersionTokens[0] == backupVersionTokens[0] && //  major version
             currentVersionTokens[1] < backupVersionTokens[1]) {  //  minor version
        versionOK = false;
    }

    if (!versionOK) {
        LOG_ERROR(
            "Current OS version %s older than backup version %s", (currentVersion).c_str(), (backupVersion).c_str());
        return false;
    }
    else {
        LOG_DEBUG("OK to restore backup version %s", (backupVersion).c_str());
    }

    return true;
    return versionOK;
}

bool BackupRestore::CanRestoreFromBackup(const std::filesystem::path &extractedBackup)

M module-vfs/drivers/src/thirdparty/lwext4/ext4_bdev.cpp => module-vfs/drivers/src/thirdparty/lwext4/ext4_bdev.cpp +1 -1
@@ 69,7 69,7 @@ namespace purefs::fs::drivers::ext4::internal
                }
                const auto err = diskmm->read(ctx->disk_h, buf, blk_id, blk_cnt);
                if (err) {
                    LOG_ERROR("Sector write error errno: %i", err);
                    LOG_ERROR("Sector read error errno: %i", err);
                }
                return -err;
            }

M products/BellHybrid/apps/application-bell-bedtime/ApplicationBellBedtime.cpp => products/BellHybrid/apps/application-bell-bedtime/ApplicationBellBedtime.cpp +6 -5
@@ 5,16 5,17 @@
#include "presenter/BellBedtimeWindowPresenter.hpp"
#include "windows/BellBedtimeWindow.hpp"
#include "common/models/BedtimeModel.hpp"
#include <common/windows/BellFinishedWindow.hpp>
#include "models/BedtimeListItemProvider.hpp"

#include <common/windows/BellFinishedCallbackWindow.hpp>
namespace app
{
    ApplicationBellBedtime::ApplicationBellBedtime(std::string name,
                                                   std::string parent,
                                                   StatusIndicators statusIndicators,
                                                   StartInBackground startInBackground)
        : Application(name, parent, statusIndicators, startInBackground)
                                                   StartInBackground startInBackground,
                                                   uint32_t stackDepth)
        : Application(name, parent, statusIndicators, startInBackground, stackDepth)
    {}

    sys::ReturnCodes ApplicationBellBedtime::InitHandler()


@@ 38,9 39,9 @@ namespace app
            return std::make_unique<gui::BellBedtimeWindow>(app, std::move(presenter));
        });

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

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

M products/BellHybrid/apps/application-bell-bedtime/include/application-bell-bedtime/ApplicationBellBedtime.hpp => products/BellHybrid/apps/application-bell-bedtime/include/application-bell-bedtime/ApplicationBellBedtime.hpp +2 -1
@@ 22,7 22,8 @@ namespace app
        explicit ApplicationBellBedtime(std::string name                    = applicationBellBedtimeName,
                                        std::string parent                  = "",
                                        StatusIndicators statusIndicators   = StatusIndicators{},
                                        StartInBackground startInBackground = {false});
                                        StartInBackground startInBackground = {false},
                                        uint32_t stackDepth                 = 4096 * 2);

        auto InitHandler() -> sys::ReturnCodes override;


M products/BellHybrid/apps/application-bell-bedtime/windows/BellBedtimeWindow.cpp => products/BellHybrid/apps/application-bell-bedtime/windows/BellBedtimeWindow.cpp +3 -6
@@ 14,7 14,7 @@
#include <module-gui/gui/widgets/Image.hpp>

#include <widgets/SideListView.hpp>
#include <common/windows/BellFinishedCallbackWindow.hpp>
#include <common/windows/BellFinishedWindow.hpp>
#include "service-appmgr/Controller.hpp" // for Controller

namespace gui


@@ 70,11 70,8 @@ namespace gui
    {
        presenter->saveData();
        if (showSuccessWindow) {
            application->switchWindow(BellFinishedCallbackWindow::defaultName,
                                      BellFinishedCallbackWindowSwitchData::Factory::create(
                                          "circle_success",
                                          utils::translate("app_bell_bedtime_set_finished"),
                                          [this]() { app::manager::Controller::switchBack(application); }));
            application->switchWindow(gui::window::bell_finished::defaultName,
                                      BellFinishedWindowData::Factory::create("circle_success_big", "", "", true));
        }
        else {
            application->returnToPreviousWindow();

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

    inline constexpr auto defaultAlarmRingingTime = std::chrono::seconds(30);
    inline constexpr auto defaultAlarmRingingTime = std::chrono::minutes(5);

    class AbstractView;
    class AbstractPresenter;

M products/BellHybrid/apps/application-bell-main/windows/BellBatteryStatusWindow.cpp => products/BellHybrid/apps/application-bell-main/windows/BellBatteryStatusWindow.cpp +1 -4
@@ 93,7 93,6 @@ namespace gui
    void BellBatteryStatusWindow::onBeforeShow(ShowMode mode, SwitchData *data)
    {
        if (data != nullptr) {
            WindowWithTimer::onBeforeShow(mode, data);
            const auto &switchData = static_cast<Data &>(*data);
            const auto entry       = battery_utils::getScaledBatteryLevel(batteryEntries, switchData.chargeLevel);
            if (entry) {


@@ 104,8 103,6 @@ namespace gui
                body->resize();
            }
        }
        else {
            LOG_ERROR("BellBatteryStatusWindow must be invoked with a valid SwitchData");
        }
        WindowWithTimer::onBeforeShow(mode, data);
    }
} // namespace gui

M products/BellHybrid/apps/application-bell-main/windows/BellMainMenuWindow.cpp => products/BellHybrid/apps/application-bell-main/windows/BellMainMenuWindow.cpp +0 -2
@@ 50,10 50,8 @@ namespace gui
        addAppMenu(utils::translate("app_bellmain_alarm"), app::applicationBellAlarmName);
        addAppMenu(utils::translate("app_bellmain_power_nap"), app::applicationBellPowerNapName);
        addAppMenu(utils::translate("app_bellmain_background_sounds"), app::applicationBellBackgroundSoundsName);
        // for demo only - to be replaced by call o final window
        addAppMenu(utils::translate("app_bellmain_meditation_timer"), app::applicationBellMeditationTimerName);
        addAppMenu(utils::translate("app_bellmain_bedtime"), app::applicationBellBedtimeName);

        addAppMenu(utils::translate("app_bellmain_settings"), app::applicationBellSettingsName);

        return menuOptionList;

M products/BellHybrid/apps/application-bell-meditation-timer/ApplicationBellMeditationTimer.cpp => products/BellHybrid/apps/application-bell-meditation-timer/ApplicationBellMeditationTimer.cpp +3 -2
@@ 16,8 16,9 @@ namespace app
    ApplicationBellMeditationTimer::ApplicationBellMeditationTimer(std::string name,
                                                                   std::string parent,
                                                                   StatusIndicators statusIndicators,
                                                                   StartInBackground startInBackground)
        : Application(std::move(name), std::move(parent), statusIndicators, startInBackground)
                                                                   StartInBackground startInBackground,
                                                                   uint32_t stackDepth)
        : Application(std::move(name), std::move(parent), statusIndicators, startInBackground, stackDepth)
    {}

    ApplicationBellMeditationTimer::~ApplicationBellMeditationTimer() = default;

M products/BellHybrid/apps/application-bell-meditation-timer/include/application-bell-meditation-timer/ApplicationBellMeditationTimer.hpp => products/BellHybrid/apps/application-bell-meditation-timer/include/application-bell-meditation-timer/ApplicationBellMeditationTimer.hpp +2 -1
@@ 25,7 25,8 @@ namespace app
        ApplicationBellMeditationTimer(std::string name                    = applicationBellMeditationTimerName,
                                       std::string parent                  = "",
                                       StatusIndicators statusIndicators   = StatusIndicators{},
                                       StartInBackground startInBackground = {false});
                                       StartInBackground startInBackground = {false},
                                       uint32_t stackDepth                 = 4096 * 2);
        ~ApplicationBellMeditationTimer();

        sys::ReturnCodes InitHandler() override;

M products/BellHybrid/apps/application-bell-powernap/ApplicationBellPowerNap.cpp => products/BellHybrid/apps/application-bell-powernap/ApplicationBellPowerNap.cpp +3 -2
@@ 17,8 17,9 @@ namespace app
    ApplicationBellPowerNap::ApplicationBellPowerNap(std::string name,
                                                     std::string parent,
                                                     StatusIndicators statusIndicators,
                                                     StartInBackground startInBackground)
        : Application(std::move(name), std::move(parent), statusIndicators, startInBackground)
                                                     StartInBackground startInBackground,
                                                     uint32_t stackDepth)
        : Application(std::move(name), std::move(parent), statusIndicators, startInBackground, stackDepth)
    {}

    ApplicationBellPowerNap::~ApplicationBellPowerNap() = default;

M products/BellHybrid/apps/application-bell-powernap/include/application-bell-powernap/ApplicationBellPowerNap.hpp => products/BellHybrid/apps/application-bell-powernap/include/application-bell-powernap/ApplicationBellPowerNap.hpp +4 -3
@@ 7,9 7,9 @@

namespace gui::window::name
{
    inline constexpr auto powernapProgress = "PowerNapProgressWindow";
    inline constexpr auto powernapProgress     = "PowerNapProgressWindow";
    inline constexpr auto powernapSessionEnded = "PowerNapSessionEndedWindow";
}
} // namespace gui::window::name
namespace app
{
    namespace powernap


@@ 25,7 25,8 @@ namespace app
        ApplicationBellPowerNap(std::string name                    = applicationBellPowerNapName,
                                std::string parent                  = "",
                                StatusIndicators statusIndicators   = StatusIndicators{},
                                StartInBackground startInBackground = {false});
                                StartInBackground startInBackground = {false},
                                uint32_t stackDepth                 = 4096 * 2);
        ~ApplicationBellPowerNap();
        sys::ReturnCodes InitHandler() override;


M products/BellHybrid/apps/application-bell-settings/ApplicationBellSettings.cpp => products/BellHybrid/apps/application-bell-settings/ApplicationBellSettings.cpp +8 -13
@@ 35,7 35,6 @@
#include <common/BellPowerOffPresenter.hpp>
#include <common/models/BedtimeModel.hpp>
#include <common/windows/BellFinishedWindow.hpp>
#include <common/windows/BellFinishedCallbackWindow.hpp>
#include <common/windows/BellTurnOffWindow.hpp>
#include <common/popups/BellTurnOffOptionWindow.hpp>
#include <common/models/AudioModel.hpp>


@@ 47,8 46,9 @@ namespace app
    ApplicationBellSettings::ApplicationBellSettings(std::string name,
                                                     std::string parent,
                                                     StatusIndicators statusIndicators,
                                                     StartInBackground startInBackground)
        : Application(std::move(name), std::move(parent), statusIndicators, startInBackground)
                                                     StartInBackground startInBackground,
                                                     uint32_t stackDepth)
        : Application(std::move(name), std::move(parent), statusIndicators, startInBackground, stackDepth)
    {}

    sys::ReturnCodes ApplicationBellSettings::InitHandler()


@@ 115,11 115,6 @@ namespace app
                                  return std::make_unique<gui::BellFinishedWindow>(app);
                              });

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

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


@@ 217,16 212,16 @@ namespace app
                return std::make_unique<gui::AboutYourBellWindow>(app, std::move(aboutYourBellPresenter));
            });

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

        attachPopups({gui::popup::ID::AlarmActivated,
                      gui::popup::ID::AlarmDeactivated,
                      gui::popup::ID::PowerOff,
                      gui::popup::ID::Reboot,
                      gui::popup::ID::BedtimeNotification});

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

    sys::MessagePointer ApplicationBellSettings::DataReceivedHandler(sys::DataMessage *msgl, sys::ResponseMessage *resp)

M products/BellHybrid/apps/application-bell-settings/include/application-bell-settings/ApplicationBellSettings.hpp => products/BellHybrid/apps/application-bell-settings/include/application-bell-settings/ApplicationBellSettings.hpp +11 -10
@@ 8,15 8,15 @@

namespace gui::window::name
{
    inline constexpr auto bellSettings            = "BellSettings";
    inline constexpr auto bellSettingsAdvanced    = "BellSettingsAdvanced";
    inline constexpr auto bellSettingsTimeUnits   = "BellSettingsTimeUnits";
    inline constexpr auto bellSettingsDialog      = "BellSettingsDialog";
    inline constexpr auto bellSettingsFinished    = "BellSettingsFinished";
    inline constexpr auto bellSettingsFrontlight  = "BellSettingsFrontlight";
    inline constexpr auto bellSettingsHomeView    = "BellSettingsHomeView";
    inline constexpr auto bellSettingsLanguage    = "BellSettingsLanguage";
    inline constexpr auto bellSettingsBedtimeTone = "BellSettingsBedtimeTone";
    inline constexpr auto bellSettings             = "BellSettings";
    inline constexpr auto bellSettingsAdvanced     = "BellSettingsAdvanced";
    inline constexpr auto bellSettingsTimeUnits    = "BellSettingsTimeUnits";
    inline constexpr auto bellSettingsDialog       = "BellSettingsDialog";
    inline constexpr auto bellSettingsFinished     = "BellSettingsFinished";
    inline constexpr auto bellSettingsFrontlight   = "BellSettingsFrontlight";
    inline constexpr auto bellSettingsHomeView     = "BellSettingsHomeView";
    inline constexpr auto bellSettingsLanguage     = "BellSettingsLanguage";
    inline constexpr auto bellSettingsBedtimeTone  = "BellSettingsBedtimeTone";
    inline constexpr auto bellSettingsFactoryReset = "BellSettingsFactoryReset";
} // namespace gui::window::name



@@ 30,7 30,8 @@ namespace app
        ApplicationBellSettings(std::string name                    = applicationBellSettingsName,
                                std::string parent                  = "",
                                StatusIndicators statusIndicators   = StatusIndicators{},
                                StartInBackground startInBackground = {false});
                                StartInBackground startInBackground = {false},
                                uint32_t stackDepth                 = 4096 * 2);

        sys::ReturnCodes InitHandler() override;


M products/BellHybrid/apps/application-bell-settings/windows/advanced/BellSettingsAdvancedWindow.cpp => products/BellHybrid/apps/application-bell-settings/windows/advanced/BellSettingsAdvancedWindow.cpp +0 -1
@@ 15,7 15,6 @@
#include <service-appmgr/messages/SwitchRequest.hpp>
#include <windows/advanced/AboutYourBellWindow.hpp>
#include <common/windows/BellFactoryReset.hpp>
#include <common/windows/BellFinishedCallbackWindow.hpp>
#include <common/windows/BellTurnOffWindow.hpp>

namespace gui

M products/BellHybrid/apps/common/CMakeLists.txt => products/BellHybrid/apps/common/CMakeLists.txt +0 -3
@@ 18,7 18,6 @@ target_sources(application-bell-common
        src/BellListItemProvider.cpp
        src/windows/BellFactoryReset.cpp
        src/windows/BellFinishedWindow.cpp
        src/windows/BellFinishedCallbackWindow.cpp
        src/windows/BellTurnOffWindow.cpp
        src/windows/BellWelcomeWindow.cpp
        src/BellSideListItemWithCallbacks.cpp


@@ 45,11 44,9 @@ target_sources(application-bell-common
        include/common/BellPowerOffPresenter.hpp
        include/common/windows/BellFactoryReset.hpp
        include/common/windows/BellFinishedWindow.hpp
        include/common/windows/BellFinishedCallbackWindow.hpp
        include/common/windows/BellTurnOffWindow.hpp
        include/common/windows/BellWelcomeWindow.hpp
        include/common/TimeUtils.hpp
        include/common/data/BellFinishedCallbackWindowSwitchData.hpp
        include/common/models/AbstractAlarmModel.hpp
        include/common/models/AbstractBedtimeModel.hpp
        include/common/models/AbstractSettingsModel.hpp

D products/BellHybrid/apps/common/include/common/data/BellFinishedCallbackWindowSwitchData.hpp => products/BellHybrid/apps/common/include/common/data/BellFinishedCallbackWindowSwitchData.hpp +0 -37
@@ 1,37 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 <functional> // for function
#include <SwitchData.hpp>
#include <utf8/UTF8.hpp>

namespace gui
{
    struct BellFinishedCallbackWindowSwitchData : public gui::SwitchData
    {
      public:
        struct Factory
        {
            static std::unique_ptr<BellFinishedCallbackWindowSwitchData> create(const UTF8 &icon,
                                                                                const UTF8 &text,
                                                                                std::function<void()> finishCallback)
            {
                return std::unique_ptr<BellFinishedCallbackWindowSwitchData>(
                    new BellFinishedCallbackWindowSwitchData(icon, text, finishCallback));
            }
        };

        UTF8 icon{};
        UTF8 text{};
        std::function<void()> finishCallback;

      private:
        BellFinishedCallbackWindowSwitchData() = default;

        BellFinishedCallbackWindowSwitchData(const UTF8 &icon, const UTF8 &text, std::function<void()> finishCallback)
            : icon{icon}, text{text}, finishCallback{finishCallback}
        {}
    };
} // namespace gui

M products/BellHybrid/apps/common/include/common/data/BellFinishedWindowSwitchData.hpp => products/BellHybrid/apps/common/include/common/data/BellFinishedWindowSwitchData.hpp +10 -4
@@ 15,21 15,27 @@ namespace gui
        {
            static std::unique_ptr<BellFinishedWindowData> create(const UTF8 &icon,
                                                                  const std::string &windowToReturn,
                                                                  const UTF8 &text = "")
                                                                  const UTF8 &text      = "",
                                                                  bool closeApplication = false)
            {
                return std::unique_ptr<BellFinishedWindowData>(new BellFinishedWindowData(icon, windowToReturn, text));
                return std::unique_ptr<BellFinishedWindowData>(
                    new BellFinishedWindowData(icon, windowToReturn, text, closeApplication));
            }
        };

        UTF8 icon{};
        std::string windowToReturn;
        UTF8 text{};
        bool closeApplication;

      private:
        BellFinishedWindowData() = default;

        BellFinishedWindowData(const UTF8 &icon, const std::string &windowToReturn, const UTF8 &text = "")
            : icon{icon}, windowToReturn{windowToReturn}, text{text}
        BellFinishedWindowData(const UTF8 &icon,
                               const std::string &windowToReturn,
                               const UTF8 &text      = "",
                               bool closeApplication = false)
            : icon{icon}, windowToReturn{windowToReturn}, text{text}, closeApplication{closeApplication}
        {}
    };
} // namespace gui

D products/BellHybrid/apps/common/include/common/windows/BellFinishedCallbackWindow.hpp => products/BellHybrid/apps/common/include/common/windows/BellFinishedCallbackWindow.hpp +0 -30
@@ 1,30 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 <common/data/BellFinishedCallbackWindowSwitchData.hpp>
#include <apps-common/messages/DialogMetadataMessage.hpp>
#include <apps-common/popups/WindowWithTimer.hpp>

namespace gui
{
    class Icon;

    class BellFinishedCallbackWindow : public WindowWithTimer
    {
      public:
        static constexpr auto defaultName = "BellFinishedCallbackWindow";

        explicit BellFinishedCallbackWindow(app::ApplicationCommon *app, const std::string &name = defaultName);

      protected:
        void buildInterface() override;
        bool onInput(const InputEvent &inputEvent) override;
        void onBeforeShow(ShowMode mode, SwitchData *data) override;

        Icon *icon{};
        std::function<void()> finishCallback = nullptr;
    };

} // namespace gui

M products/BellHybrid/apps/common/include/common/windows/BellFinishedWindow.hpp => products/BellHybrid/apps/common/include/common/windows/BellFinishedWindow.hpp +3 -1
@@ 11,7 11,7 @@ namespace gui
{
    namespace window::bell_finished
    {
        constexpr inline auto defaultName         = "BellFinishedWindow";
        constexpr inline auto defaultName = "BellFinishedWindow";
    } // namespace window::bell_finished

    class Icon;


@@ 24,11 24,13 @@ namespace gui

      protected:
        void buildInterface() override;
        void exit();
        bool onInput(const InputEvent &inputEvent) override;
        void onBeforeShow(ShowMode mode, SwitchData *data) override;

        Icon *icon{};
        std::string windowToReturn;
        bool closeApplication; // is close application is true windowToReturn variable is ignored
    };

} // namespace gui

M products/BellHybrid/apps/common/src/AlarmModel.cpp => products/BellHybrid/apps/common/src/AlarmModel.cpp +4 -4
@@ 126,7 126,7 @@ namespace app
    }
    void AlarmModel::turnOff()
    {
        snoozeCount = 0;
        snoozeCount    = 0;
        nextSnoozeTime = TIME_POINT_INVALID;
        alarms::AlarmServiceAPI::requestTurnOffRingingAlarm(app, cachedRecord.parent->ID);
    }


@@ 139,7 139,7 @@ namespace app

        snoozeCount++;
        nextSnoozeTime =
            std::chrono::floor<std::chrono::minutes>(TimePointNow()) + std::chrono::minutes(snoozeDuration);
            std::chrono::floor<std::chrono::seconds>(TimePointNow()) + std::chrono::minutes(snoozeDuration);
        alarms::AlarmServiceAPI::requestSnoozeRingingAlarm(app, cachedRecord.parent->ID, nextSnoozeTime);
        alarmStatus = alarms::AlarmStatus::Snoozed;
    }


@@ 178,11 178,11 @@ namespace app
    void AlarmModel::updateCache(const SingleEventRecord &record, alarms::AlarmStatus status)
    {
        if (record.startDate != cachedRecord.startDate) {
            snoozeCount  = 0;
            snoozeCount = 0;
        }
        cachedRecord = record;
        alarmStatus  = status;
        state = State::Valid;
        state        = State::Valid;
    }
    void AlarmModel::setDefaultAlarmTime()
    {

M products/BellHybrid/apps/common/src/popups/AlarmActivatedWindow.cpp => products/BellHybrid/apps/common/src/popups/AlarmActivatedWindow.cpp +1 -1
@@ 63,7 63,7 @@ namespace gui
            app::manager::actions::AbortPopup,
            std::make_unique<gui::PopupRequestParams>(gui::popup::ID::AlarmDeactivated));

        if (application->getPrevWindow() == gui::window::name::bellAlarmSet) {
        if (application->getPrevWindow() == popup::window::alarm_deactivated_window) {
            app::manager::Controller::sendAction(
                application,
                app::manager::actions::Launch,

M products/BellHybrid/apps/common/src/popups/AlarmDeactivatedWindow.cpp => products/BellHybrid/apps/common/src/popups/AlarmDeactivatedWindow.cpp +1 -1
@@ 65,7 65,7 @@ namespace gui
                                             app::manager::actions::AbortPopup,
                                             std::make_unique<gui::PopupRequestParams>(gui::popup::ID::AlarmActivated));

        if (application->getPrevWindow() == gui::window::name::bellAlarmSet) {
        if (application->getPrevWindow() == popup::window::alarm_activated_window) {
            app::manager::Controller::sendAction(
                application,
                app::manager::actions::Launch,

M products/BellHybrid/apps/common/src/popups/BedtimeNotificationWindow.cpp => products/BellHybrid/apps/common/src/popups/BedtimeNotificationWindow.cpp +1 -0
@@ 39,6 39,7 @@ namespace gui

        icon->setAlignment(Alignment(Alignment::Horizontal::Center, Alignment::Vertical::Top));
        icon->image->setMargins(Margins(0, icon::image_top_margin, 0, icon::image_bottom_margin));
        icon->text->setFont(style::window::font::verybiglight);
    }
    void BedtimeNotificationWindow::onBeforeShow(ShowMode mode, [[maybe_unused]] SwitchData *data)
    {

D products/BellHybrid/apps/common/src/windows/BellFinishedCallbackWindow.cpp => products/BellHybrid/apps/common/src/windows/BellFinishedCallbackWindow.cpp +0 -59
@@ 1,59 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 "common/windows/BellFinishedCallbackWindow.hpp"
#include "common/data/BellFinishedCallbackWindowSwitchData.hpp"
#include <apps-common/ApplicationCommon.hpp>
#include <gui/input/InputEvent.hpp>
#include <gui/widgets/Icon.hpp>

namespace gui
{

    BellFinishedCallbackWindow::BellFinishedCallbackWindow(app::ApplicationCommon *app, const std::string &name)
        : WindowWithTimer(app, name)
    {
        buildInterface();

        timerCallback = [this](Item &, sys::Timer &) {
            if (this->finishCallback) {
                this->finishCallback();
            }
            return true;
        };
    }

    void BellFinishedCallbackWindow::buildInterface()
    {
        WindowWithTimer::buildInterface();

        statusBar->setVisible(false);
        header->setTitleVisibility(false);
        navBar->setVisible(false);

        icon = new Icon(this, 0, 0, style::window_width, style::window_height, {}, {});
        icon->setAlignment(Alignment(Alignment::Horizontal::Center, Alignment::Vertical::Center));
    }

    bool BellFinishedCallbackWindow::onInput(const InputEvent &inputEvent)
    {
        if (inputEvent.isShortRelease(KeyCode::KEY_ENTER) || inputEvent.isShortRelease(KeyCode::KEY_RF)) {
            if (this->finishCallback) {
                this->finishCallback();
            }
            return true;
        }
        return false;
    }

    void BellFinishedCallbackWindow::onBeforeShow(ShowMode mode, SwitchData *data)
    {
        WindowWithTimer::onBeforeShow(mode, data);

        if (auto metadata = dynamic_cast<BellFinishedCallbackWindowSwitchData *>(data)) {
            icon->image->set(metadata->icon);
            finishCallback = metadata->finishCallback;
        }
    }

} // namespace gui

M products/BellHybrid/apps/common/src/windows/BellFinishedWindow.cpp => products/BellHybrid/apps/common/src/windows/BellFinishedWindow.cpp +15 -4
@@ 5,6 5,7 @@
#include <apps-common/ApplicationCommon.hpp>
#include <gui/input/InputEvent.hpp>
#include <gui/widgets/Icon.hpp>
#include "service-appmgr/Controller.hpp"

namespace gui
{


@@ 13,13 14,22 @@ namespace gui
        : WindowWithTimer(app, name)
    {
        buildInterface();

        timerCallback = [this](Item &, sys::Timer &) {
            application->switchWindow(windowToReturn);
            exit();
            return true;
        };
    }

    void BellFinishedWindow::exit()
    {
        if (closeApplication) {
            app::manager::Controller::switchBack(application);
        }
        else {
            application->switchWindow(windowToReturn);
        }
    }

    void BellFinishedWindow::buildInterface()
    {
        WindowWithTimer::buildInterface();


@@ 37,7 47,7 @@ namespace gui
    bool BellFinishedWindow::onInput(const InputEvent &inputEvent)
    {
        if (inputEvent.isShortRelease(KeyCode::KEY_ENTER) || inputEvent.isShortRelease(KeyCode::KEY_RF)) {
            application->switchWindow(windowToReturn);
            exit();
            return true;
        }
        return false;


@@ 51,7 61,8 @@ namespace gui
            icon->image->set(metadata->icon);
            icon->text->setRichText(metadata->text);
            icon->resizeItems();
            windowToReturn = metadata->windowToReturn;
            windowToReturn   = metadata->windowToReturn;
            closeApplication = metadata->closeApplication;
        }
    }


M products/PurePhone/CMakeLists.txt => products/PurePhone/CMakeLists.txt +1 -0
@@ 23,6 23,7 @@ target_compile_options(PurePhone

target_sources(PurePhone
    PRIVATE
        ${TARGET_SOURCES}
        PurePhoneMain.cpp
        PlatformFactory.cpp
        EinkSentinelPure.cpp

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