~aleteoryx/muditaos

d4d9827851f53321c68ed2becc3d9009679e2ea0 — Przemyslaw Brudny 4 years ago ecf5268 + fed0508
Merge remote-tracking branch 'origin/stable'
141 files changed, 481 insertions(+), 575 deletions(-)

A art/phone/application_call/call_mute_W_M.png
A art/phone/application_call/call_mute_on_W_M.png
A art/phone/application_call/call_speaker_W_M.png
A art/phone/application_call/call_speaker_on_W_M.png
A art/phone/application_call/calllog_arrow_den_W_G.png
A art/phone/application_call/calllog_arrow_in_W_G.png
A art/phone/application_call/calllog_arrow_out_W_G.png
A art/phone/application_call/callog_empty_W_G.png
D art/phone/application_call/microphone_off.png
D art/phone/application_call/microphone_on.png
D art/phone/application_call/mute.png
D art/phone/application_call/mute.svg
D art/phone/application_call/speaker.svg
D art/phone/application_call/speaker_off.png
D art/phone/application_call/speaker_on.png
D image/assets/audio/bell/alarm/Atumnal_Sea.mp3
A image/assets/audio/bell/alarm/Autumnal_Sea.mp3
M image/assets/audio/bell/alarm/Brand_New_Morning.mp3
A image/assets/audio/bell/alarm/Bubbling_Brook.mp3
M image/assets/audio/bell/alarm/Delightful_Morning.mp3
D image/assets/audio/bell/alarm/Dymiter-Morning_Dew.mp3
M image/assets/audio/bell/alarm/Gentle_Daybreak.mp3
M image/assets/audio/bell/alarm/Joyous_Morning.mp3
M image/assets/audio/bell/alarm/Koshi_Bells.mp3
M image/assets/audio/bell/alarm/Melodious_Chords.mp3
M image/assets/audio/bell/alarm/Morning_Dew.mp3
M image/assets/audio/bell/alarm/Natures_Harmony.mp3
D image/assets/audio/bell/alarm/Rhytmical_Hang_Drum.mp3
A image/assets/audio/bell/alarm/Rhytmical_Hangdrum.mp3
M image/assets/audio/bell/alarm/Sunrise_Guitar.mp3
A image/assets/audio/bell/bg_sounds/Ancient_Greek.mp3
D image/assets/audio/bell/bg_sounds/Ancient_Greek_Reading.mp3
D image/assets/audio/bell/bg_sounds/Atumnal_Sea.mp3
A image/assets/audio/bell/bg_sounds/Autumnal_Sea.mp3
M image/assets/audio/bell/bg_sounds/Bubbling_Brook.mp3
M image/assets/audio/bell/bg_sounds/Charming_Bells.mp3
M image/assets/audio/bell/bg_sounds/Forest_Creek.mp3
M image/assets/audio/bell/bg_sounds/Mountain_Lagoon.mp3
M image/assets/audio/bell/bg_sounds/Mystic_Nature.mp3
M image/assets/audio/bell/bg_sounds/Natures_Harmony.mp3
M image/assets/audio/bell/bg_sounds/Rhythmic_Lullaby.mp3
M image/assets/audio/bell/bg_sounds/Seaside_Symphony.mp3
M image/assets/audio/bell/bg_sounds/Under_the_Water.mp3
M image/assets/audio/bell/bg_sounds/Woodland_Ambiance.mp3
D image/assets/audio/bell/bg_sounds/test_440Hz_16B_44k1_PCM.wav
M image/assets/audio/bell/chimes/Blissful_Dream.mp3
M image/assets/audio/bell/chimes/Gentle_Chime.mp3
M image/assets/audio/bell/chimes/Rise_&_Shine.mp3
M image/assets/audio/bell/chimes/Twinkle_Chime.mp3
M image/assets/audio/bell/evening_reminder/Evening_Horizon.mp3
M image/assets/audio/bell/evening_reminder/Evolving_Dusk.mp3
M image/assets/audio/bell/evening_reminder/Melodic_Mirth.mp3
M image/assets/audio/bell/evening_reminder/Twilight_Gleam.mp3
M image/assets/audio/bell/meditation/Meditation_Gong.mp3
M image/assets/audio/bell/prewakeup/Joyful_Awakening.mp3
M image/assets/audio/bell/prewakeup/Morning_Spirit.mp3
M image/assets/audio/bell/prewakeup/Radiant_Morning.mp3
M image/assets/audio/bell/prewakeup/Spring_Sunrise.mp3
R image/assets/images/{mail => call_message_W_M}.vpi
A image/assets/images/call_mute_W_M.vpi
A image/assets/images/call_mute_on_W_M.vpi
R image/assets/images/{speaker_off => call_speaker_W_M}.vpi
A image/assets/images/call_speaker_on_W_M.vpi
A image/assets/images/calllog_arrow_den_W_G.vpi
A image/assets/images/calllog_arrow_in_W_G.vpi
A image/assets/images/calllog_arrow_out_W_G.vpi
A image/assets/images/callog_empty_W_G.vpi
A image/assets/images/cross_W_M.vpi
D image/assets/images/microphone_off.vpi
D image/assets/images/microphone_on.vpi
D image/assets/images/mute.vpi
D image/assets/images/speaker.vpi
D image/assets/images/speaker_on.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 image/user/db/settings_bell_002.sql
M module-apps/application-alarm-clock/widgets/AlarmClockStyle.hpp
M module-apps/application-alarm-clock/windows/AlarmClockMainWindow.cpp
M module-apps/application-calendar/include/application-calendar/widgets/CalendarStyle.hpp
M module-apps/application-calendar/windows/CalendarMainWindow.cpp
M module-apps/application-call/widgets/StateIcon.hpp
M module-apps/application-call/widgets/StateIcons.cpp
M module-apps/application-call/windows/CallWindow.cpp
M module-apps/application-calllog/data/CallLogStyle.hpp
M module-apps/application-calllog/windows/CallLogDetailsWindow.cpp
M module-apps/application-calllog/windows/CallLogMainWindow.cpp
M module-apps/application-calllog/windows/CallLogMainWindow.hpp
M module-apps/application-meditation/data/Style.hpp
M module-apps/application-meditation/widgets/TimerProperty.cpp
M module-apps/application-meditation/widgets/TimerProperty.hpp
M module-apps/application-meditation/windows/MeditationTimerWindow.cpp
M module-apps/application-meditation/windows/MeditationWindow.cpp
M module-apps/application-messages/data/MessagesStyle.hpp
M module-apps/application-messages/windows/MessagesMainWindow.cpp
M module-apps/application-music-player/data/MusicPlayerStyle.hpp
M module-apps/application-music-player/windows/MusicPlayerMainWindow.cpp
M module-apps/application-notes/windows/NoteMainWindow.cpp
M module-apps/application-phonebook/data/PhonebookStyle.hpp
M module-apps/application-phonebook/windows/PhonebookMainWindow.cpp
M module-apps/application-settings/models/apps/SoundsModel.cpp
M module-apps/application-settings/widgets/SettingsStyle.hpp
M module-apps/application-settings/widgets/advanced/ColorTestListStyle.hpp
M module-apps/application-settings/windows/apps/SoundSelectWindow.cpp
M module-apps/application-settings/windows/display-keypad/QuotesMainWindow.cpp
M module-apps/application-settings/windows/network/ApnSettingsWindow.cpp
M module-apps/apps-common/audio/AbstractSoundsPlayer.hpp
M module-apps/apps-common/audio/SoundsPlayer.cpp
M module-apps/apps-common/audio/SoundsPlayer.hpp
M module-apps/apps-common/popups/PowerOffWindow.cpp
M module-apps/apps-common/widgets/BellSideListItem.cpp
M module-apps/apps-common/widgets/DateAndTimeStyle.hpp
M module-apps/apps-common/windows/AppWindow.cpp
M module-bluetooth/Bluetooth/interface/BluetoothDriverImpl.cpp
M module-bluetooth/Bluetooth/interface/profiles/HFP/HFP.cpp
M module-bluetooth/Bluetooth/interface/profiles/HSP/HSP.cpp
M module-bluetooth/Bluetooth/interface/profiles/SCO/SCO.cpp
M module-bsp/board/rt1051/bellpx/board/BoardDefinitions.hpp
M module-gui/gui/core/FontManager.cpp
M module-gui/gui/core/ImageManager.cpp
M module-gui/gui/widgets/Label.cpp
M module-gui/gui/widgets/Label.hpp
M module-gui/gui/widgets/NavBar.cpp
M module-gui/gui/widgets/NavBar.hpp
M module-gui/gui/widgets/Style.hpp
M module-services/service-evtmgr/EventManager.cpp
M module-utils/log/api/log/debug.hpp
M products/BellHybrid/apps/application-bell-alarm/windows/BellAlarmSetWindow.cpp
M products/BellHybrid/apps/application-bell-alarm/windows/BellAlarmSetWindow.hpp
M products/BellHybrid/apps/application-bell-onboarding/ApplicationBellOnBoarding.cpp
M products/BellHybrid/apps/application-bell-onboarding/windows/OnBoardingFinalizeWindow.cpp
M products/BellHybrid/apps/application-bell-settings/models/alarm_settings/SnoozeListItemProvider.cpp
M products/BellHybrid/apps/common/include/common/data/BellFinishedWindowSwitchData.hpp
M products/BellHybrid/apps/common/src/windows/BellFinishedWindow.cpp
M products/BellHybrid/apps/common/src/windows/BellWelcomeWindow.cpp
M products/BellHybrid/services/evtmgr/internal/key_sequences/AlarmActivateSequence.hpp
M products/BellHybrid/services/evtmgr/internal/key_sequences/AlarmDeactivateSequence.hpp
A products/BellHybrid/services/evtmgr/internal/key_sequences/MovedSequence.hpp
A art/phone/application_call/call_mute_W_M.png => art/phone/application_call/call_mute_W_M.png +0 -0
A art/phone/application_call/call_mute_on_W_M.png => art/phone/application_call/call_mute_on_W_M.png +0 -0
A art/phone/application_call/call_speaker_W_M.png => art/phone/application_call/call_speaker_W_M.png +0 -0
A art/phone/application_call/call_speaker_on_W_M.png => art/phone/application_call/call_speaker_on_W_M.png +0 -0
A art/phone/application_call/calllog_arrow_den_W_G.png => art/phone/application_call/calllog_arrow_den_W_G.png +0 -0
A art/phone/application_call/calllog_arrow_in_W_G.png => art/phone/application_call/calllog_arrow_in_W_G.png +0 -0
A art/phone/application_call/calllog_arrow_out_W_G.png => art/phone/application_call/calllog_arrow_out_W_G.png +0 -0
A art/phone/application_call/callog_empty_W_G.png => art/phone/application_call/callog_empty_W_G.png +0 -0
D art/phone/application_call/microphone_off.png => art/phone/application_call/microphone_off.png +0 -0
D art/phone/application_call/microphone_on.png => art/phone/application_call/microphone_on.png +0 -0
D art/phone/application_call/mute.png => art/phone/application_call/mute.png +0 -0
D art/phone/application_call/mute.svg => art/phone/application_call/mute.svg +0 -170
@@ 1,170 0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->

<svg
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:cc="http://creativecommons.org/ns#"
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:svg="http://www.w3.org/2000/svg"
   xmlns="http://www.w3.org/2000/svg"
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
   width="40"
   height="40"
   viewBox="0 0 10.583333 10.583334"
   version="1.1"
   id="svg3333"
   inkscape:version="0.92.3 (2405546, 2018-03-11)"
   sodipodi:docname="mute.svg"
   inkscape:export-filename="/home/robert/git/PurePhone/art/phone/application_call/microphone_on.png"
   inkscape:export-xdpi="96"
   inkscape:export-ydpi="96">
  <defs
     id="defs3327" />
  <sodipodi:namedview
     id="base"
     pagecolor="#ffffff"
     bordercolor="#666666"
     borderopacity="1.0"
     inkscape:pageopacity="0.0"
     inkscape:pageshadow="2"
     inkscape:zoom="15.839192"
     inkscape:cx="8.5471826"
     inkscape:cy="25.550921"
     inkscape:document-units="px"
     inkscape:current-layer="layer1"
     showgrid="false"
     units="px"
     showguides="true"
     inkscape:guide-bbox="true"
     inkscape:window-width="1853"
     inkscape:window-height="1145"
     inkscape:window-x="67"
     inkscape:window-y="27"
     inkscape:window-maximized="1">
    <sodipodi:guide
       position="4.6302082,5.2621376"
       orientation="0,1"
       id="guide3956"
       inkscape:locked="false" />
    <sodipodi:guide
       position="4.0176017,7.9952839"
       orientation="1,0"
       id="guide3958"
       inkscape:locked="false" />
  </sodipodi:namedview>
  <metadata
     id="metadata3330">
    <rdf:RDF>
      <cc:Work
         rdf:about="">
        <dc:format>image/svg+xml</dc:format>
        <dc:type
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
        <dc:title></dc:title>
      </cc:Work>
    </rdf:RDF>
  </metadata>
  <g
     inkscape:label="Layer 1"
     inkscape:groupmode="layer"
     id="layer1"
     transform="translate(0,-286.41666)">
    <rect
       style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers"
       id="rect3983"
       width="10.583332"
       height="10.583332"
       x="1.4531367e-06"
       y="286.41666" />
    <path
       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916658;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
       d="m 5.2089844,286.73633 c -0.8323323,0 -1.4550791,0.79807 -1.4550782,1.71875 a 0.26460975,0.26460975 0 1 0 0.5273438,0 c -7e-7,-0.6867 0.4449367,-1.18946 0.9277344,-1.18946 0.4827977,0 0.9257822,0.50276 0.9257812,1.18946 a 0.26464845,0.26464845 0 1 0 0.5292969,0 c 1.3e-6,-0.92069 -0.6227458,-1.71875 -1.4550781,-1.71875 z"
       id="path3225"
       inkscape:connector-curvature="0" />
    <path
       style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.52916694;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers"
       d="m 2.8269168,292.64068 c -2e-6,1.05207 1.0661119,1.90494 2.3812242,1.90494 0.8373189,0 1.573698,-0.3457 1.9982458,-0.86844 0.2422551,-0.29833 0.3829761,-0.65428 0.3829761,-1.0365"
       id="path3225-2-9"
       inkscape:connector-curvature="0"
       sodipodi:nodetypes="cssc" />
    <path
       style="fill:none;stroke:#000000;stroke-width:0.52916676;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
       d="m 2.8269158,290.81712 v 1.82356"
       id="path3274"
       inkscape:connector-curvature="0" />
    <path
       style="fill:none;stroke:#000000;stroke-width:0.52916676;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
       d="m 7.5893608,290.81712 v 1.82356"
       id="path3276"
       inkscape:connector-curvature="0" />
    <path
       style="fill:none;stroke:#000000;stroke-width:0.52916676;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
       d="M 4.0176019,296.32164 H 6.398852"
       id="path3280"
       inkscape:connector-curvature="0" />
    <path
       style="fill:none;stroke:#000000;stroke-width:0.52916676;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
       d="m 5.210291,294.62665 v 1.69499"
       id="path3282"
       inkscape:connector-curvature="0" />
  </g>
  <g
     inkscape:groupmode="layer"
     id="layer8"
     inkscape:label="mic on"
     style="display:inline"
     sodipodi:insensitive="true">
    <path
       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.5291667;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
       d="M 3.7539062,2.0390625 V 5.5917969 H 4.28125 V 2.0390625 Z"
       id="path3904"
       inkscape:connector-curvature="0" />
    <path
       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.5291667;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
       d="M 6.1347656,2.0390625 V 5.5917969 H 6.6640625 V 2.0390625 Z"
       id="path3906"
       inkscape:connector-curvature="0" />
    <path
       style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.26458335px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
       d="M 4.0278088,3.7679501 4.1104911,1.7363281 4.3821616,1.0276228 4.996373,0.7205171 5.6578314,0.7677641 6.1421133,1.3583519 6.342913,2.5631511 6.2247956,6.1539251 5.6696429,6.8508186 4.9609376,6.9571245 4.3467262,6.5319012 4.0136719,5.32162 Z"
       id="path3934"
       inkscape:connector-curvature="0" />
    <path
       transform="translate(0,-286.41665)"
       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.52916658;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
       d="m 4.0136719,291.73828 a 0.26460975,0.26460975 0 0 0 -0.2597657,0.26953 c -9e-7,0.92069 0.6227459,1.71875 1.4550782,1.71875 0.5299365,0 0.9833218,-0.33413 1.2324218,-0.80273 0.1421466,-0.2674 0.2226563,-0.58152 0.2226563,-0.91602 a 0.26464845,0.26464845 0 1 0 -0.5292969,0 c 0,0.24949 -0.060039,0.47963 -0.1601562,0.66797 -0.175452,0.33006 -0.4582352,0.52149 -0.765625,0.52149 -0.4827977,0 -0.9277351,-0.50276 -0.9277344,-1.18946 a 0.26460975,0.26460975 0 0 0 -0.2675781,-0.26953 z"
       id="path3225-2"
       inkscape:connector-curvature="0" />
  </g>
  <g
     inkscape:groupmode="layer"
     id="layer7"
     inkscape:label="mic muted"
     style="display:none"
     sodipodi:insensitive="true">
    <path
       transform="translate(0,-286.41665)"
       style="fill:none;stroke:#000000;stroke-width:0.52916676;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
       d="m 4.0176019,288.45573 v 0.54897 l 2.3812501,2.38538 v -2.93435"
       id="path3232"
       inkscape:connector-curvature="0" />
    <path
       style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.52916658;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers"
       d="m 4.0176017,5.5854419 c -1e-6,0.80369 0.53306,1.45521 1.190625,1.45521 0.418663,0 0.786856,-0.26411 0.999132,-0.66344"
       id="path3225-2-98"
       inkscape:connector-curvature="0"
       sodipodi:nodetypes="csc" />
    <path
       transform="translate(0,-286.41665)"
       style="display:inline;fill:none;stroke:#000000;stroke-width:0.52916676;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
       d="m 1.1995777,287.64831 c 8.2786722,8.34883 8.2786722,8.34883 8.2786722,8.34883"
       id="path3308"
       inkscape:connector-curvature="0" />
    <path
       style="fill:none;stroke:#000000;stroke-width:0.5291667;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
       d="M 4.0176017,5.5854419 V 4.0455264"
       id="path3981"
       inkscape:connector-curvature="0" />
  </g>
</svg>

D art/phone/application_call/speaker.svg => art/phone/application_call/speaker.svg +0 -116
@@ 1,116 0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->

<svg
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:cc="http://creativecommons.org/ns#"
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:svg="http://www.w3.org/2000/svg"
   xmlns="http://www.w3.org/2000/svg"
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
   width="40"
   height="40"
   viewBox="0 0 10.583333 10.583334"
   version="1.1"
   id="svg2623"
   inkscape:version="0.92.3 (2405546, 2018-03-11)"
   sodipodi:docname="speaker.svg"
   inkscape:export-filename="/home/robert/git/PurePhone/art/phone/application_call/speaker_off.png"
   inkscape:export-xdpi="96"
   inkscape:export-ydpi="96">
  <defs
     id="defs2617" />
  <sodipodi:namedview
     id="base"
     pagecolor="#ffffff"
     bordercolor="#666666"
     borderopacity="1.0"
     inkscape:pageopacity="0.0"
     inkscape:pageshadow="2"
     inkscape:zoom="7.9195959"
     inkscape:cx="13.995623"
     inkscape:cy="22.561386"
     inkscape:document-units="px"
     inkscape:current-layer="layer1"
     showgrid="false"
     units="px"
     inkscape:window-width="1853"
     inkscape:window-height="1145"
     inkscape:window-x="67"
     inkscape:window-y="27"
     inkscape:window-maximized="1" />
  <metadata
     id="metadata2620">
    <rdf:RDF>
      <cc:Work
         rdf:about="">
        <dc:format>image/svg+xml</dc:format>
        <dc:type
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
        <dc:title></dc:title>
      </cc:Work>
    </rdf:RDF>
  </metadata>
  <g
     inkscape:label="speaker common"
     inkscape:groupmode="layer"
     id="layer1"
     transform="translate(0,-286.41666)">
    <rect
       style="opacity:0.93000034;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.5291667;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers"
       id="rect3222"
       x="-2.7755576e-17"
       y="286.41666"
       width="10.583334"
       height="10.583334"
       inkscape:export-xdpi="96"
       inkscape:export-ydpi="96" />
    <rect
       style="display:inline;opacity:0.93000034;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.52890205;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers"
       id="rect2513"
       width="1.852348"
       height="3.4398482"
       x="0.85079437"
       y="290.01236"
       rx="0.52916664"
       ry="0.52916664" />
    <path
       style="display:inline;fill:none;stroke:#000000;stroke-width:0.52916664;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
       d="m 2.7503894,290.22563 2.892715,-2.05292 v 7.09564 l -2.892715,-2.06518"
       id="path2536"
       inkscape:connector-curvature="0" />
  </g>
  <g
     inkscape:groupmode="layer"
     id="layer5"
     inkscape:label="speaker on"
     style="display:inline">
    <path
       transform="translate(0,-286.41665)"
       style="display:inline;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
       d="m 2.7503894,290.22563 2.892716,-2.05292 v 7.09564 l -2.892716,-2.06518 z"
       id="path2601"
       inkscape:connector-curvature="0" />
    <path
       transform="translate(0,-286.41665)"
       style="display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
       d="M 0.85079162,290.01235 H 2.7031424 l 0.04725,3.19082 -1.89959778,0.24903 v -3.43985"
       id="path2603"
       inkscape:connector-curvature="0" />
    <path
       transform="translate(0,-286.41665)"
       style="display:inline;opacity:0.93000034;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.52916658;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers"
       d="m 7.0514724,290.17007 c 0.282672,0.42102 0.447589,0.92773 0.447588,1.47296 -1e-6,0.55172 -0.168872,1.064 -0.457747,1.48797"
       id="path2595"
       inkscape:connector-curvature="0"
       sodipodi:nodetypes="ccc" />
    <path
       transform="translate(0,-286.41665)"
       style="display:inline;opacity:0.93000034;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.52916664;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers"
       d="m 8.7855294,289.27189 c 0.533229,0.64169 0.853875,1.46634 0.853873,2.36588 2e-6,0.90571 -0.325054,1.73549 -0.86487,2.37906"
       id="path2597"
       inkscape:connector-curvature="0"
       sodipodi:nodetypes="ccc" />
  </g>
</svg>

D art/phone/application_call/speaker_off.png => art/phone/application_call/speaker_off.png +0 -0
D art/phone/application_call/speaker_on.png => art/phone/application_call/speaker_on.png +0 -0
D image/assets/audio/bell/alarm/Atumnal_Sea.mp3 => image/assets/audio/bell/alarm/Atumnal_Sea.mp3 +0 -0
A image/assets/audio/bell/alarm/Autumnal_Sea.mp3 => image/assets/audio/bell/alarm/Autumnal_Sea.mp3 +0 -0
M image/assets/audio/bell/alarm/Brand_New_Morning.mp3 => image/assets/audio/bell/alarm/Brand_New_Morning.mp3 +0 -0
A image/assets/audio/bell/alarm/Bubbling_Brook.mp3 => image/assets/audio/bell/alarm/Bubbling_Brook.mp3 +0 -0
M image/assets/audio/bell/alarm/Delightful_Morning.mp3 => image/assets/audio/bell/alarm/Delightful_Morning.mp3 +0 -0
D image/assets/audio/bell/alarm/Dymiter-Morning_Dew.mp3 => image/assets/audio/bell/alarm/Dymiter-Morning_Dew.mp3 +0 -0
M image/assets/audio/bell/alarm/Gentle_Daybreak.mp3 => image/assets/audio/bell/alarm/Gentle_Daybreak.mp3 +0 -0
M image/assets/audio/bell/alarm/Joyous_Morning.mp3 => image/assets/audio/bell/alarm/Joyous_Morning.mp3 +0 -0
M image/assets/audio/bell/alarm/Koshi_Bells.mp3 => image/assets/audio/bell/alarm/Koshi_Bells.mp3 +0 -0
M image/assets/audio/bell/alarm/Melodious_Chords.mp3 => image/assets/audio/bell/alarm/Melodious_Chords.mp3 +0 -0
M image/assets/audio/bell/alarm/Morning_Dew.mp3 => image/assets/audio/bell/alarm/Morning_Dew.mp3 +0 -0
M image/assets/audio/bell/alarm/Natures_Harmony.mp3 => image/assets/audio/bell/alarm/Natures_Harmony.mp3 +0 -0
D image/assets/audio/bell/alarm/Rhytmical_Hang_Drum.mp3 => image/assets/audio/bell/alarm/Rhytmical_Hang_Drum.mp3 +0 -0
A image/assets/audio/bell/alarm/Rhytmical_Hangdrum.mp3 => image/assets/audio/bell/alarm/Rhytmical_Hangdrum.mp3 +0 -0
M image/assets/audio/bell/alarm/Sunrise_Guitar.mp3 => image/assets/audio/bell/alarm/Sunrise_Guitar.mp3 +0 -0
A image/assets/audio/bell/bg_sounds/Ancient_Greek.mp3 => image/assets/audio/bell/bg_sounds/Ancient_Greek.mp3 +0 -0
D image/assets/audio/bell/bg_sounds/Ancient_Greek_Reading.mp3 => image/assets/audio/bell/bg_sounds/Ancient_Greek_Reading.mp3 +0 -0
D image/assets/audio/bell/bg_sounds/Atumnal_Sea.mp3 => image/assets/audio/bell/bg_sounds/Atumnal_Sea.mp3 +0 -0
A image/assets/audio/bell/bg_sounds/Autumnal_Sea.mp3 => image/assets/audio/bell/bg_sounds/Autumnal_Sea.mp3 +0 -0
M image/assets/audio/bell/bg_sounds/Bubbling_Brook.mp3 => image/assets/audio/bell/bg_sounds/Bubbling_Brook.mp3 +0 -0
M image/assets/audio/bell/bg_sounds/Charming_Bells.mp3 => image/assets/audio/bell/bg_sounds/Charming_Bells.mp3 +0 -0
M image/assets/audio/bell/bg_sounds/Forest_Creek.mp3 => image/assets/audio/bell/bg_sounds/Forest_Creek.mp3 +0 -0
M image/assets/audio/bell/bg_sounds/Mountain_Lagoon.mp3 => image/assets/audio/bell/bg_sounds/Mountain_Lagoon.mp3 +0 -0
M image/assets/audio/bell/bg_sounds/Mystic_Nature.mp3 => image/assets/audio/bell/bg_sounds/Mystic_Nature.mp3 +0 -0
M image/assets/audio/bell/bg_sounds/Natures_Harmony.mp3 => image/assets/audio/bell/bg_sounds/Natures_Harmony.mp3 +0 -0
M image/assets/audio/bell/bg_sounds/Rhythmic_Lullaby.mp3 => image/assets/audio/bell/bg_sounds/Rhythmic_Lullaby.mp3 +0 -0
M image/assets/audio/bell/bg_sounds/Seaside_Symphony.mp3 => image/assets/audio/bell/bg_sounds/Seaside_Symphony.mp3 +0 -0
M image/assets/audio/bell/bg_sounds/Under_the_Water.mp3 => image/assets/audio/bell/bg_sounds/Under_the_Water.mp3 +0 -0
M image/assets/audio/bell/bg_sounds/Woodland_Ambiance.mp3 => image/assets/audio/bell/bg_sounds/Woodland_Ambiance.mp3 +0 -0
D image/assets/audio/bell/bg_sounds/test_440Hz_16B_44k1_PCM.wav => image/assets/audio/bell/bg_sounds/test_440Hz_16B_44k1_PCM.wav +0 -0
M image/assets/audio/bell/chimes/Blissful_Dream.mp3 => image/assets/audio/bell/chimes/Blissful_Dream.mp3 +0 -0
M image/assets/audio/bell/chimes/Gentle_Chime.mp3 => image/assets/audio/bell/chimes/Gentle_Chime.mp3 +0 -0
M image/assets/audio/bell/chimes/Rise_&_Shine.mp3 => image/assets/audio/bell/chimes/Rise_&_Shine.mp3 +0 -0
M image/assets/audio/bell/chimes/Twinkle_Chime.mp3 => image/assets/audio/bell/chimes/Twinkle_Chime.mp3 +0 -0
M image/assets/audio/bell/evening_reminder/Evening_Horizon.mp3 => image/assets/audio/bell/evening_reminder/Evening_Horizon.mp3 +0 -0
M image/assets/audio/bell/evening_reminder/Evolving_Dusk.mp3 => image/assets/audio/bell/evening_reminder/Evolving_Dusk.mp3 +0 -0
M image/assets/audio/bell/evening_reminder/Melodic_Mirth.mp3 => image/assets/audio/bell/evening_reminder/Melodic_Mirth.mp3 +0 -0
M image/assets/audio/bell/evening_reminder/Twilight_Gleam.mp3 => image/assets/audio/bell/evening_reminder/Twilight_Gleam.mp3 +0 -0
M image/assets/audio/bell/meditation/Meditation_Gong.mp3 => image/assets/audio/bell/meditation/Meditation_Gong.mp3 +0 -0
M image/assets/audio/bell/prewakeup/Joyful_Awakening.mp3 => image/assets/audio/bell/prewakeup/Joyful_Awakening.mp3 +0 -0
M image/assets/audio/bell/prewakeup/Morning_Spirit.mp3 => image/assets/audio/bell/prewakeup/Morning_Spirit.mp3 +0 -0
M image/assets/audio/bell/prewakeup/Radiant_Morning.mp3 => image/assets/audio/bell/prewakeup/Radiant_Morning.mp3 +0 -0
M image/assets/audio/bell/prewakeup/Spring_Sunrise.mp3 => image/assets/audio/bell/prewakeup/Spring_Sunrise.mp3 +0 -0
R image/assets/images/mail.vpi => image/assets/images/call_message_W_M.vpi +0 -0
A image/assets/images/call_mute_W_M.vpi => image/assets/images/call_mute_W_M.vpi +0 -0
A image/assets/images/call_mute_on_W_M.vpi => image/assets/images/call_mute_on_W_M.vpi +0 -0
R image/assets/images/speaker_off.vpi => image/assets/images/call_speaker_W_M.vpi +0 -0
A image/assets/images/call_speaker_on_W_M.vpi => image/assets/images/call_speaker_on_W_M.vpi +0 -0
A image/assets/images/calllog_arrow_den_W_G.vpi => image/assets/images/calllog_arrow_den_W_G.vpi +0 -0
A image/assets/images/calllog_arrow_in_W_G.vpi => image/assets/images/calllog_arrow_in_W_G.vpi +0 -0
A image/assets/images/calllog_arrow_out_W_G.vpi => image/assets/images/calllog_arrow_out_W_G.vpi +0 -0
A image/assets/images/callog_empty_W_G.vpi => image/assets/images/callog_empty_W_G.vpi +0 -0
A image/assets/images/cross_W_M.vpi => image/assets/images/cross_W_M.vpi +0 -0
D image/assets/images/microphone_off.vpi => image/assets/images/microphone_off.vpi +0 -0
D image/assets/images/microphone_on.vpi => image/assets/images/microphone_on.vpi +0 -0
D image/assets/images/mute.vpi => image/assets/images/mute.vpi +0 -0
D image/assets/images/speaker.vpi => image/assets/images/speaker.vpi +0 -0
D image/assets/images/speaker_on.vpi => image/assets/images/speaker_on.vpi +0 -0
M image/assets/lang/Deutsch.json => image/assets/lang/Deutsch.json +6 -6
@@ 100,7 100,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='9'>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='5'>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",


@@ 124,7 124,7 @@
  "app_calendar_event_detail": "Ereignis",
  "app_calendar_event_detail_repeat": "Wiederholen",
  "app_calendar_event_detail_reminder": "Erinnerung",
  "app_calendar_no_events_information": "<text align='center' color='9'>Noch kein Ereignis.<p>Zum Hinzufügen <b>linken Pfeil</b> drücken.</p></text>",
  "app_calendar_no_events_information": "<text align='center' color='5'>Noch kein Ereignis.<p>Zum Hinzufügen <b>linken Pfeil</b> drücken.</p></text>",
  "app_calendar_repeat_never": "Niemals",
  "app_calendar_repeat_daily": "Täglich",
  "app_calendar_repeat_weekly": "Wöchentlich",


@@ 169,7 169,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='9'>Noch keine Notiz.<p>Zum Hinzufügen <b>linken Pfeil</b> drücken.</p></text>",
  "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_search_no_results": "Keine Notizen gefunden.",
  "app_calllog_title_main": "Anrufe",
  "app_calllog_type": "Anruf",


@@ 306,7 306,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='9'>Noch keine Nachrichten.<p>Zum Hinzufügen <b>linken Pfeil</b> drücken.</p></text>",
  "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_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",


@@ 460,7 460,7 @@
  "phone_lock_invalid_retry": "<text>Falscher Sicherheitscode. <br></br> Sicherheitscode nochmals konfigurieren.</text>",
  "phone_lock_configure": "Sicherheitscode konfigurieren",
  "app_settings_security_usb_passcode": "USB-Sicherheit",
  "app_settings_apn_settings_no_apns": "<text align='center' color='9'>Noch keine APN.<p>Zum Hinzufügen <b>linken Pfeil</b> drücken.</p></text>",
  "app_settings_apn_settings_no_apns": "<text align='center' color='5'>Noch keine APN.<p>Zum Hinzufügen <b>linken Pfeil</b> drücken.</p></text>",
  "app_settings_apn_options_delete": "Löschen",
  "app_settings_apn_options_edit": "Ändern",
  "app_settings_apn_options_set_as_default": "Als Standard festlegen",


@@ 574,7 574,7 @@
  "app_call_private_number": "Private Nummer",
  "tethering": "Tethering",
  "tethering_turn_off_question": "Tethering ausschalten?",
  "tethering_enable_question": "<text>Sie sind mit dem Computer verbunden.<br />Tethering einschalten?<br /><text color='9'>(einige Funktionen können deaktiviert sein)</text></text>",
  "tethering_enable_question": "<text>Sie sind mit dem Computer verbunden.<br />Tethering einschalten?<br /><text color='5'>(einige Funktionen können deaktiviert sein)</text></text>",
  "tethering_phone_mode_change_prohibited": "<text>Tethering ist eingeschaltet.<br /><br />Andere Betriebsarten (Verbunden, DND,<br />Offline) werden von dieser Betriebsart überlagert<br />und funktionieren nicht.</text>",
  "tethering_menu_access_decline": "<text>Tethering ist eingeschaltet.<br /><br />Schalten Sie Tethering aus,<br />um auf das Menü zuzugreifen</text>",
  "app_bell_turn_off_question": "Schalten Sie das Gerät aus?",

M image/assets/lang/English.json => image/assets/lang/English.json +11 -8
@@ 109,7 109,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='9'>No alarms yet.<p>Press <b>left arrow</b> to add new.</p></text>",
  "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_options_edit": "Edit",
  "app_alarm_clock_options_delete": "Delete",
  "app_alarm_clock_options_turn_off_all_alarms": "Turn off all alarms",


@@ 143,19 143,22 @@
  "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='9'>No notes yet.<p>Press <b>left arrow</b> to add new.</p></text>",
  "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_search_no_results": "No notes found.",
  "app_calllog_title_main": "Calls",
  "app_calllog_no_calls": "<text align='center' color='9'>No calls yet.</text>",
  "app_calllog_no_calls": "<text align='center' color='5'>No calls yet.</text>",
  "app_calllog_type": "Call",
  "app_calllog_duration": "Duration",
  "app_calllog_incoming_call": "Incoming call",
  "app_calllog_outgoing_call": "Outgoing call",
  "app_calllog_missed_call": "Missed call",
  "app_calllog_rejected_call": "Rejected call",
  "app_calllog_empty_incoming": "<text color='5'>Incoming</text>",
  "app_calllog_empty_outgoing": "<text color='5'>Outgoing</text>",
  "app_calllog_empty_missed": "<text color='5'>Missed</text>",
  "app_calllog_date": "Date",
  "app_calllog_options_delete_call": "Delete call",
  "app_calllog_delete_call_confirmation": "Do you really want to delete this call from the list?",
  "app_calllog_delete_call_confirmation": "Delete this call from the list?",
  "app_desktop_unlock": "UNLOCK",
  "app_desktop_menu": "MENU",
  "app_desktop_emergency": "SOS",


@@ 286,7 289,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='9'>No messages yet.<p>Press <b>left arrow</b> to add new.</p></text>",
  "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_thread_delete_confirmation": "Delete this conversation?",
  "app_messages_message_delete_confirmation": "Delete this message?",
  "app_messages_thread_no_result": "There are no results",


@@ 452,7 455,7 @@
  "phone_lock_invalid_retry": "<text>Wrong passcode. <br></br> Configure passcode again.</text>",
  "phone_lock_configure": "Configure passcode",
  "app_settings_security_usb_passcode": "USB security",
  "app_settings_apn_settings_no_apns": "<text align='center' color='9'>No APNs yet.<p>Press <b>left arrow</b> to add new.</p></text>",
  "app_settings_apn_settings_no_apns": "<text align='center' color='5'>No APNs yet.<p>Press <b>left arrow</b> to add new.</p></text>",
  "app_settings_apn_options_delete": "Delete",
  "app_settings_apn_options_edit": "Edit",
  "app_settings_apn_options_set_as_default": "Set as default",


@@ 488,7 491,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='9'>No contacts yet.<p>Press <b>left arrow</b> to add new.</p></text>",
  "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_contact_title": "Add contact",
  "app_phonebook_contact_no_name": "no name",
  "app_phonebook_contact_information": "Information",


@@ 578,7 581,7 @@
  "app_call_private_number": "Private number",
  "tethering": "Tethering",
  "tethering_turn_off_question": "Turn tethering off?",
  "tethering_enable_question": "<text>You're connected to the computer.<br />Turn tethering on?<br /><text color='9'>(some functions may be disabled)</text></text>",
  "tethering_enable_question": "<text>You're connected to the computer.<br />Turn tethering on?<br /><text color='5'>(some functions may be disabled)</text></text>",
  "tethering_phone_mode_change_prohibited": "<text>Tethering is on.<br /><br />Other modes (Connected, DND,<br />Offline) are overriden by this mode<br />and are not working.</text>",
  "tethering_menu_access_decline": "<text>Tethering is on.<br /><br />To access menu,<br />turn tethering off.</text>",
  "app_bell_settings_time_units_time_fmt_top_message": "Time format",

M image/assets/lang/Espanol.json => image/assets/lang/Espanol.json +6 -6
@@ 100,7 100,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='9'>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='5'>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",


@@ 124,7 124,7 @@
  "app_calendar_event_detail": "Evento",
  "app_calendar_event_detail_repeat": "Repetir",
  "app_calendar_event_detail_reminder": "Recordatorio",
  "app_calendar_no_events_information": "<text align='center' color='9'>No hay eventos.<p>Pulsa la <b>flecha izquierda</b> para añadir uno.</p></text>",
  "app_calendar_no_events_information": "<text align='center' color='5'>No hay eventos.<p>Pulsa la <b>flecha izquierda</b> para añadir uno.</p></text>",
  "app_calendar_repeat_never": "Nunca",
  "app_calendar_repeat_daily": "Diario",
  "app_calendar_repeat_weekly": "Semanal",


@@ 169,7 169,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='9'>No hay notas.<p>Pulsa la <b>flecha izquierda</b> para añadir una.</p></text>",
  "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_search_no_results": "No se encontraron notas.",
  "app_calllog_title_main": "Llamadas",
  "app_calllog_type": "Llamada",


@@ 306,7 306,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='9'>No hay mensajes.<p>Pulsa la <b>flecha izquierda</b> para añadir uno.</p></text>",
  "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_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",


@@ 460,7 460,7 @@
  "phone_lock_invalid_retry": "<text>Código de acceso incorrecto. <br></br> Vuelve a configurar el código de acceso.</text>",
  "phone_lock_configure": "Configura el código de acceso:",
  "app_settings_security_usb_passcode": "Seguridad USB",
  "app_settings_apn_settings_no_apns": "<text align='center' color='9'>No hay ningún APN.<p>Pulsa la <b>flecha izquierda</b> para añadir uno.</p></text>",
  "app_settings_apn_settings_no_apns": "<text align='center' color='5'>No hay ningún APN.<p>Pulsa la <b>flecha izquierda</b> para añadir uno.</p></text>",
  "app_settings_apn_options_delete": "Eliminar",
  "app_settings_apn_options_edit": "Editar",
  "app_settings_apn_options_set_as_default": "Establecer como predeterminado",


@@ 574,7 574,7 @@
  "app_call_private_number": "Número privado",
  "tethering": "Anclaje de red",
  "tethering_turn_off_question": "¿Desactivar el anclaje de red?",
  "tethering_enable_question": "<text>Estás conectado al ordenador.<br />¿Activar el anclaje de red?<br /><text color='9'>(algunas funciones podrían desactivarse)</text></text>",
  "tethering_enable_question": "<text>Estás conectado al ordenador.<br />¿Activar el anclaje de red?<br /><text color='5'>(algunas funciones podrían desactivarse)</text></text>",
  "tethering_phone_mode_change_prohibited": "<text>El anclaje de red está activado.<br /><br />Este modo anula otros modos (Conectado, No molestar,<br />Desconectado) <br />y hace que dejen de funcionar.</text>",
  "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á",

M image/assets/lang/Francais.json => image/assets/lang/Francais.json +5 -5
@@ 104,7 104,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='9'>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='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_options_edit": "Modifier",
  "app_alarm_clock_options_delete": "Supprimer",
  "app_alarm_clock_options_turn_off_all_alarms": "Éteignez toutes les alarmes",


@@ 138,7 138,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 = '9'> 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 = '5'> 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",


@@ 276,7 276,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 = '9'>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 = '5'>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",


@@ 429,7 429,7 @@
  "phone_lock_invalid_retry": "<text>Mauvais code d'accès. <br></br> Veuillez configurer le code d'accès à nouveau.</text>",
  "phone_lock_configure": "Configurer le code d'accès",
  "app_settings_security_usb_passcode": "Sécurité USBS",
  "app_settings_apn_settings_no_apns": "<text align='center' color='9'>No APNs yet.<p>Press <b>left arrow</b> to add new.</p></text>",
  "app_settings_apn_settings_no_apns": "<text align='center' color='5'>No APNs yet.<p>Press <b>left arrow</b> to add new.</p></text>",
  "app_settings_apn_options_delete": "Delete",
  "app_settings_apn_options_edit": "Edit",
  "app_settings_apn_options_set_as_default": "Set as default",


@@ 543,7 543,7 @@
  "app_call_private_number": "Numéro privé",
  "tethering": "Partage de connexion",
  "tethering_turn_off_question": "Voulez-vous désactiver le partage de connexion?",
  "tethering_enable_question": "<text>Vous êtes connecté à l'ordinateur<br />Voulez-vous activer le partage de connexion?<br /><text color='9'>(certaines fonctions peuvent être désactivées)</text></text>",
  "tethering_enable_question": "<text>Vous êtes connecté à l'ordinateur<br />Voulez-vous activer le partage de connexion?<br /><text color='5'>(certaines fonctions peuvent être désactivées)</text></text>",
  "tethering_phone_mode_change_prohibited": "<text>Le partage de connexion est activé.<br /><br />Ce mode-ci remplace et désactive les autres modes<br />(Connecté, NPD, Hors ligne)</text>",
  "tethering_menu_access_decline": "<text>Le partage de connexion est activé.<br /><br />Pour accéder au menu, veuillez<br />désactiver le partage de connextion.</text>",
  "app_bellmain_next_alarm": "Prochaine alarme",

M image/assets/lang/Polski.json => image/assets/lang/Polski.json +9 -9
@@ 101,7 101,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='9'>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='5'>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",


@@ 125,7 125,7 @@
  "app_calendar_event_detail": "Wydarzenie",
  "app_calendar_event_detail_repeat": "Powtarzaj",
  "app_calendar_event_detail_reminder": "Przypomnienie",
  "app_calendar_no_events_information": "<text align='center' color='9'>Nie ma jeszcze żadnych wydarzeń.<p>Wciśnij <b>lewą strzałkę</b>, by dodać nowe.</p></text>",
  "app_calendar_no_events_information": "<text align='center' color='5'>Nie ma jeszcze żadnych wydarzeń.<p>Wciśnij <b>lewą strzałkę</b>, by dodać nowe.</p></text>",
  "app_calendar_repeat_never": "Nigdy",
  "app_calendar_repeat_daily": "Codziennie",
  "app_calendar_repeat_weekly": "Co tydzień",


@@ 170,10 170,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='9'>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='5'>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='9'>Brak połączeń.</text>",
  "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",


@@ 309,7 309,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='9'>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='5'>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",


@@ 473,7 473,7 @@
  "phone_lock_invalid_retry": "<text>Błędny kod. <br></br> Ponownie skonfiguruj kod.</text>",
  "phone_lock_configure": "Skonfiguruj kod",
  "app_settings_security_usb_passcode": "Zabezpieczenie USB",
  "app_settings_apn_settings_no_apns": "<text align='center' color='9'>Nie ma jeszcze żadnego APN.<p>Wciśnij <b>lewą strzałkę</b>, by dodać nowy.</p></text>",
  "app_settings_apn_settings_no_apns": "<text align='center' color='5'>Nie ma jeszcze żadnego APN.<p>Wciśnij <b>lewą strzałkę</b>, by dodać nowy.</p></text>",
  "app_settings_apn_options_delete": "Usuń",
  "app_settings_apn_options_edit": "Edytuj",
  "app_settings_apn_options_set_as_default": "Ustaw jako domyślne",


@@ 506,7 506,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='9'>Brak kontaktów.<p>Naciśnij <b>'w lewo'</b> by dodać kontakt.</p></text>",
  "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_contact_title": "Dodaj kontakt",
  "app_phonebook_contact_no_name": "brak nazwy",
  "app_phonebook_contact_information": "Informacje",


@@ 589,7 589,7 @@
  "app_call_private_number": "Numer prywatny",
  "tethering": "Tethering",
  "tethering_turn_off_question": "Wyłączyć tethering?",
  "tethering_enable_question": "<text>Połączono z komputerem.<br />Włączyć tethering?<br /><text color='9'>(Niektóre funkcje mogą być niedostępne)</text></text>",
  "tethering_enable_question": "<text>Połączono z komputerem.<br />Włączyć tethering?<br /><text color='5'>(Niektóre funkcje mogą być niedostępne)</text></text>",
  "tethering_phone_mode_change_prohibited": "<text>Tethering włączony.<br /><br />Inne tryby (Połączony, Nie przeszkadzać,<br />Offline) zostały unieważnione przez ten tryb<br />i nie działają.</text>",
  "tethering_menu_access_decline": "<text>Tethering włączony.<br /><br />Aby przejść do menu,<br />wyłącz tethering.</text>",
  "app_bell_settings_time_units_time_fmt_top_message": "Format czasu",


@@ 604,7 604,7 @@
  "app_bellmain_background_sounds": "Biblioteka",
  "app_bellmain_settings": "Ustawienia",
  "app_bellmain_main_window_title": "Bell Hybrid+",
  "app_bell_onboarding_finalize": "<text>Dobra robota!<br />Obudź się z radością</text>",
  "app_bell_onboarding_finalize": "Dobra robota!",
  "app_bell_settings_advanced": "Zaawansowane",
  "app_bell_settings_advanced_time_units": "Czas i jednostki",
  "app_bell_settings_advanced_temp_scale": "Skala temperatury",

M image/assets/lang/Svenska.json => image/assets/lang/Svenska.json +4 -4
@@ 89,7 89,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='9'>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='5'>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",


@@ 123,7 123,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='9'>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='5'>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",


@@ 248,7 248,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='9'>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='5'>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",


@@ 357,7 357,7 @@
  "phone_lock_invalid": "Fel lösenord!",
  "phone_lock_changed_successfully": "Lösenordet bytt!",
  "phone_lock_disabled": "Lösenordet avstängt!",
  "app_settings_apn_settings_no_apns": "<text align='center' color='9'>Inga APN-inställningar än.<p>Tryck <b>vänsterpil</b> för att lägga till.</p></text>",
  "app_settings_apn_settings_no_apns": "<text align='center' color='5'>Inga APN-inställningar än.<p>Tryck <b>vänsterpil</b> för att lägga till.</p></text>",
  "app_settings_apn_options_delete": "Radera",
  "app_settings_apn_options_edit": "Redigera",
  "app_settings_apn_options_set_as_default": "Välj som förval",

M image/user/db/settings_bell_002.sql => image/user/db/settings_bell_002.sql +1 -1
@@ 40,7 40,7 @@ INSERT OR IGNORE INTO settings_tab (path, value) VALUES
    ('prewake_up_tone','Joyful Awakening'),
    ('prewake_up_volume','5'),
    ('prewake_up_light_duration','10'),
    ('alarm_tone','Atumnal Sea'),
    ('alarm_tone','Autumnal Sea'),
    ('alarm_volume','5'),
    ('alarm_light_active','1'),
    ('alarm_duration','10000'),

M module-apps/application-alarm-clock/widgets/AlarmClockStyle.hpp => module-apps/application-alarm-clock/widgets/AlarmClockStyle.hpp +1 -1
@@ 15,7 15,7 @@ namespace style::alarmClock
        inline constexpr auto listView_x = style::window::default_left_margin;
        inline constexpr auto listView_y = style::window::default_vertical_pos;
        inline constexpr auto listView_w = style::listview::body_width_with_scroll;
        inline constexpr auto listView_h = style::window_height - listView_y - style::footer::height;
        inline constexpr auto listView_h = style::window_height - listView_y - style::nav_bar::height;

        namespace name
        {

M module-apps/application-alarm-clock/windows/AlarmClockMainWindow.cpp => module-apps/application-alarm-clock/windows/AlarmClockMainWindow.cpp +1 -1
@@ 59,7 59,7 @@ namespace app::alarmClock
                          0,
                          style::window::default_vertical_pos,
                          style::window_width,
                          style::window_height - ::style::window::default_vertical_pos - ::style::footer::height,
                          style::window_height - ::style::window::default_vertical_pos - ::style::nav_bar::height,
                          "empty_list_add_W_G",
                          utils::translate("app_alarm_clock_no_alarms_information"));
        emptyListIcon->setVisible(false);

M module-apps/application-calendar/include/application-calendar/widgets/CalendarStyle.hpp => module-apps/application-calendar/include/application-calendar/widgets/CalendarStyle.hpp +1 -1
@@ 17,7 17,7 @@ namespace style::window::calendar
    inline constexpr auto listView_x = style::window::default_left_margin;
    inline constexpr auto listView_y = style::window::default_vertical_pos;
    inline constexpr auto listView_w = style::listview::body_width_with_scroll;
    inline constexpr auto listView_h = style::window_height - listView_y - style::footer::height;
    inline constexpr auto listView_h = style::window_height - listView_y - style::nav_bar::height;

    namespace item
    {

M module-apps/application-calendar/windows/CalendarMainWindow.cpp => module-apps/application-calendar/windows/CalendarMainWindow.cpp +1 -1
@@ 44,7 44,7 @@ namespace gui

        offsetFromTop = style::window::default_vertical_pos + style::window::calendar::month_year_height;
        monthWidth    = style::window::default_body_width;
        monthHeight   = style::window_height - style::window::default_vertical_pos - style::footer::height;
        monthHeight   = style::window_height - style::window::default_vertical_pos - style::nav_bar::height;
        dayWidth      = style::window::calendar::day_cell_width;
        dayHeight     = style::window::calendar::day_cell_height;


M module-apps/application-call/widgets/StateIcon.hpp => module-apps/application-call/widgets/StateIcon.hpp +1 -1
@@ 75,7 75,7 @@ namespace gui
        virtual void set(const T &state)
        {
            this->state = state;
            img->set(data.at(state).first);
            img->set(data.at(state).first, ImageTypeSpecifier::W_M);
            label->setText(utils::translate(data.at(state).second));
            using namespace style::window;
            label->setFont(data.find(state) != data.begin() ? font::verysmallbold : font::verysmall);

M module-apps/application-call/widgets/StateIcons.cpp => module-apps/application-call/widgets/StateIcons.cpp +5 -5
@@ 10,14 10,14 @@ namespace gui
    {
        constexpr auto crossImg      = "cross";
        constexpr auto addContactStr = "app_call_contact";
        constexpr auto messageImg    = "mail";
        constexpr auto messageImg    = "call_message";
        constexpr auto sendSmstStr   = "app_call_message";
        constexpr auto muteImg       = "microphone_on";
        constexpr auto mutedImg      = "microphone_off";
        constexpr auto muteImg       = "call_mute";
        constexpr auto mutedImg      = "call_mute_on";
        constexpr auto muteStr       = "app_call_mute";
        constexpr auto mutedStr      = "app_call_muted";
        constexpr auto speakerImg    = "speaker_off";
        constexpr auto speakerOnImg  = "speaker_on";
        constexpr auto speakerImg    = "call_speaker";
        constexpr auto speakerOnImg  = "call_speaker_on";
        constexpr auto speakerStr    = "app_call_speaker";
        constexpr auto speakerOnStr  = "app_call_speaker_on";


M module-apps/application-call/windows/CallWindow.cpp => module-apps/application-call/windows/CallWindow.cpp +2 -2
@@ 79,7 79,7 @@ namespace gui
        speakerIcon                       = new SpeakerIcon(this, speakerIcon::x, speakerIcon::y);
        speakerIcon->focusChangedCallback = [=](gui::Item &item) {
            LOG_DEBUG("speakerIcon get/lost focus");
            navBar->setText(nav_bar::Side::Center, utils::translate(style::strings::common::Switch), false);
            navBar->setText(nav_bar::Side::Center, utils::translate(style::strings::common::Switch), item.focus);
            return true;
        };
        speakerIcon->activatedCallback = [=](gui::Item &item) {


@@ 107,7 107,7 @@ namespace gui
        microphoneIcon                       = new MicrophoneIcon(this, microphoneIcon::x, microphoneIcon::y);
        microphoneIcon->focusChangedCallback = [=](gui::Item &item) {
            LOG_DEBUG("microphoneIcon get/lost focus");
            navBar->setText(nav_bar::Side::Center, utils::translate(style::strings::common::Switch), false);
            navBar->setText(nav_bar::Side::Center, utils::translate(style::strings::common::Switch), item.focus);
            return true;
        };
        microphoneIcon->activatedCallback = [=](gui::Item &item) {

M module-apps/application-calllog/data/CallLogStyle.hpp => module-apps/application-calllog/data/CallLogStyle.hpp +17 -2
@@ 14,7 14,7 @@ namespace callLogStyle
    // DETAILS WINDOW
    namespace detailsWindow
    {
        constexpr inline auto x = style::window::navBar::leftMargin;
        constexpr inline auto x = style::nav_bar::left_margin;
        constexpr inline auto y = style::window::default_vertical_pos;
        constexpr inline auto w = style::window_width - 2 * x;
        constexpr inline auto h = style::window::default_body_height;


@@ 37,6 37,21 @@ namespace callLogStyle
            constexpr inline auto rows = 2;
            constexpr inline auto h    = rows * widget::smallH;
        } // namespace date

        namespace noCalls
        {
            constexpr inline auto infoHeight                = 33;
            constexpr inline auto infoTopMargin             = 195;
            constexpr inline auto divLineTopMargin          = 90;
            constexpr inline auto bottomBoxWidth            = 332;
            constexpr inline auto bottomBoxHeight           = 132;
            constexpr inline auto bottomBoxMargin           = 72;
            constexpr inline auto infoIconMargin            = 2;
            constexpr inline auto descriptionSize           = 32;
            constexpr inline auto descriptionLeftMargin     = 55;
            constexpr inline auto descriptionInternalMargin = 5;
            constexpr inline auto descriptionTextWidth      = 105;
        } // namespace noCalls
    }     // namespace detailsWindow

    // MAIN WINDOW


@@ 45,7 60,7 @@ namespace callLogStyle
        constexpr inline uint32_t x = style::window::default_left_margin;
        constexpr inline uint32_t y = style::window::default_vertical_pos;
        constexpr inline uint32_t w = style::listview::body_width_with_scroll;
        constexpr inline uint32_t h = style::window_height - y - style::footer::height;
        constexpr inline uint32_t h = style::window_height - y - style::nav_bar::height;
    } // namespace mainWindow

} // namespace callLogStyle

M module-apps/application-calllog/windows/CallLogDetailsWindow.cpp => module-apps/application-calllog/windows/CallLogDetailsWindow.cpp +1 -1
@@ 63,7 63,7 @@ namespace gui
            textHBox->setAlignment(Alignment(Alignment::Horizontal::Left, Alignment::Vertical::Center));

            const auto font  = style::window::font::medium;
            auto imageWidget = new gui::Image(image);
            auto imageWidget = new gui::Image(image, ImageTypeSpecifier::W_M);
            imageWidget->setMargins(margins);
            textHBox->addWidget(imageWidget);
            textHBox->addWidget(createText(text, font));

M module-apps/application-calllog/windows/CallLogMainWindow.cpp => module-apps/application-calllog/windows/CallLogMainWindow.cpp +83 -11
@@ 59,20 59,92 @@ namespace gui

        setFocusItem(list);

        emptyListIcon =
            new gui::Icon(this,
                          0,
                          ::style::window::default_vertical_pos,
                          ::style::window_width,
                          ::style::window_height - ::style::window::default_vertical_pos - ::style::footer::height,
                          "info_icon_W_G",
                          utils::translate("app_calllog_no_calls"));
        emptyListIcon->setVisible(false);
        buildInterfaceForEmptyState();

        list->emptyListCallback    = [this]() { onEmptyList(); };
        list->notEmptyListCallback = [this]() { onListFilled(); };
    }

    void CallLogMainWindow::buildInterfaceForEmptyState()
    {
        namespace MyStyle = callLogStyle::detailsWindow::noCalls;
        emptyLayout       = new VBox(this, 0, 0, style::window_width, style::window_height);
        emptyLayout->setAlignment(gui::Alignment(gui::Alignment::Horizontal::Center, gui::Alignment::Vertical::Top));

        Text *noCallsInfo = new Text(emptyLayout, 0, 0, 0, 0);
        noCallsInfo->setMinimumSize(mainWindow::w, MyStyle::infoHeight);
        noCallsInfo->setTextType(TextType::SingleLine);
        noCallsInfo->setEditMode(EditMode::Browse);
        noCallsInfo->setEdges(RectangleEdge::None);
        noCallsInfo->setFont(style::window::font::medium);
        noCallsInfo->setAlignment(gui::Alignment(gui::Alignment::Horizontal::Center, gui::Alignment::Vertical::Center));
        noCallsInfo->setRichText(utils::translate("app_calllog_no_calls"));
        noCallsInfo->setMargins(gui::Margins(0, MyStyle::infoTopMargin, 0, 0));

        Rect *divLine = new Rect(emptyLayout, 0, 0, style::window_width, 1);
        divLine->setBorderColor(ColorGrey);
        divLine->setEdges(RectangleEdge::Top);
        divLine->setMargins(gui::Margins(0, MyStyle::divLineTopMargin, 0, 0));

        HBox *noCallsBottom = new HBox(emptyLayout);
        noCallsBottom->setMinimumSize(MyStyle::bottomBoxWidth, MyStyle::bottomBoxHeight);
        noCallsBottom->setEdges(RectangleEdge::None);
        noCallsBottom->setMargins(gui::Margins(0, MyStyle::bottomBoxMargin, 0, 0));
        noCallsBottom->setAlignment(gui::Alignment(gui::Alignment::Horizontal::Left, gui::Alignment::Vertical::Center));

        ImageBox *noCallsImg = new ImageBox(noCallsBottom, new Image("callog_empty_W_G"));
        noCallsImg->setAlignment(gui::Alignment(gui::Alignment::Horizontal::Left, gui::Alignment::Vertical::Center));
        noCallsImg->setMinimumSizeToFitImage();
        noCallsImg->setMargins(Margins(MyStyle::infoIconMargin, 0, 0, 0));

        VThreeBox<VBox, VBox, VBox> *noCallsIcons = new VThreeBox<VBox, VBox, VBox>(noCallsBottom);
        noCallsIcons->setAlignment(Alignment(Alignment::Horizontal::Center, Alignment::Vertical::Center));
        noCallsIcons->setEdges(RectangleEdge::None);
        noCallsIcons->setMinimumSize(MyStyle::descriptionSize, MyStyle::bottomBoxHeight);
        noCallsIcons->setMargins(Margins(MyStyle::descriptionLeftMargin, 0, 0, 0));
        auto imgLambda = [&](const UTF8 imageName) {
            VBox *box = new VBox(noCallsIcons);
            box->setEdges(RectangleEdge::None);
            box->setAlignment(Alignment(Alignment::Horizontal::Center, Alignment::Vertical::Center));
            box->setMinimumSize(MyStyle::descriptionSize, MyStyle::descriptionSize);
            box->setMargins(Margins(0, MyStyle::descriptionInternalMargin, 0, MyStyle::descriptionInternalMargin));

            ImageBox *image = new ImageBox(box, new Image(imageName, gui::ImageTypeSpecifier::W_G));
            image->setMinimumSizeToFitImage();
            return box;
        };
        noCallsIcons->firstBox  = imgLambda("calllog_arrow_in");
        noCallsIcons->centerBox = imgLambda("calllog_arrow_out");
        noCallsIcons->lastBox   = imgLambda("calllog_arrow_den");

        VThreeBox<VBox, VBox, VBox> *noCallsDescriptions = new VThreeBox<VBox, VBox, VBox>(noCallsBottom);
        noCallsDescriptions->setAlignment(Alignment(Alignment::Horizontal::Center, Alignment::Vertical::Center));
        noCallsDescriptions->setEdges(RectangleEdge::None);
        noCallsDescriptions->setMinimumSize(MyStyle::descriptionTextWidth, MyStyle::bottomBoxHeight);
        auto descLambda = [&](const UTF8 descText) {
            VBox *box = new VBox(noCallsDescriptions);
            box->setAlignment(Alignment(Alignment::Horizontal::Center, Alignment::Vertical::Center));
            box->setEdges(RectangleEdge::None);
            box->setMinimumSize(MyStyle::descriptionTextWidth, MyStyle::descriptionSize);
            box->setMargins(Margins(0, MyStyle::descriptionInternalMargin, 0, MyStyle::descriptionInternalMargin));

            Text *desc = new Text(box, 0, 0, 0, 0);
            desc->setMaximumSize(MyStyle::descriptionTextWidth, MyStyle::descriptionSize);
            desc->setEditMode(EditMode::Browse);
            desc->setEdges(RectangleEdge::None);
            desc->setFont(style::window::font::small);
            desc->setRichText(descText);

            return box;
        };
        noCallsDescriptions->firstBox  = descLambda(utils::translate("app_calllog_empty_incoming"));
        noCallsDescriptions->centerBox = descLambda(utils::translate("app_calllog_empty_outgoing"));
        noCallsDescriptions->lastBox   = descLambda(utils::translate("app_calllog_empty_missed"));

        emptyLayout->setVisible(false);
        emptyLayout->resizeItems();
    }

    void CallLogMainWindow::destroyInterface()
    {
        erase();


@@ 104,7 176,7 @@ namespace gui
    {
        navBar->setActive(gui::nav_bar::Side::Left, false);
        navBar->setActive(gui::nav_bar::Side::Center, false);
        emptyListIcon->setVisible(true);
        emptyLayout->setVisible(true);
        application->refreshWindow(gui::RefreshModes::GUI_REFRESH_DEEP);
    }



@@ 112,7 184,7 @@ namespace gui
    {
        navBar->setActive(gui::nav_bar::Side::Left, true);
        navBar->setActive(gui::nav_bar::Side::Center, true);
        emptyListIcon->setVisible(false);
        emptyLayout->setVisible(false);
        application->refreshWindow(gui::RefreshModes::GUI_REFRESH_DEEP);
    }
} /* namespace gui */

M module-apps/application-calllog/windows/CallLogMainWindow.hpp => module-apps/application-calllog/windows/CallLogMainWindow.hpp +4 -1
@@ 16,7 16,8 @@ namespace gui
    {
        std::shared_ptr<CalllogModel> calllogModel = nullptr;
        gui::ListView *list                        = nullptr;
        gui::Icon *emptyListIcon                   = nullptr;

        gui::VBox *emptyLayout = nullptr;

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


@@ 29,6 30,8 @@ namespace gui
        void destroyInterface() override;

      private:
        void buildInterfaceForEmptyState();

        bool onDatabaseMessage(sys::Message *msg) override;
        void onEmptyList();
        void onListFilled();

M module-apps/application-meditation/data/Style.hpp => module-apps/application-meditation/data/Style.hpp +16 -25
@@ 8,40 8,31 @@
namespace style::meditation
{
    constexpr auto VerticalWidgetGap = 20;
    namespace body
    {
        constexpr auto Width  = style::window_width;
        constexpr auto Height = style::window_height - style::window::default_vertical_pos - style::footer::height - 1;
        constexpr auto X      = 1;
        constexpr auto Y      = style::window::default_vertical_pos;
    } // namespace body

    namespace timer
    {
        constexpr auto Radius = 150;
        constexpr auto X      = body::X + (body::Width / 2) - Radius;
        constexpr auto Y      = body::Y + 20;
        constexpr auto Width  = 2 * Radius;
        constexpr auto Height = Width;
        constexpr auto Radius = 142;
        constexpr auto X      = style::window_width / 2 - Radius;
        constexpr auto Y      = style::window::default_vertical_pos + 18;

        constexpr auto BorderColor = gui::ColorGrey;
        constexpr auto BorderColorOnFocused = gui::ColorFullBlack;
        constexpr auto PenWidth    = 3;
        constexpr auto BorderColor   = gui::ColorFullBlack;
        constexpr auto PenWidth      = 1;
        constexpr auto FocusPenWidth = 3;

        namespace setterValueLabel
        {
            constexpr auto X      = 100;
            constexpr auto Y      = 100;
            constexpr auto Width  = timer::Width - 2 * X;
            constexpr auto Height = timer::Height - 2 * Y;
            constexpr auto Width           = 140;
            constexpr auto Height          = 96;
            constexpr auto TopMargin       = 80;
            constexpr auto BottomLineWidth = 100;
            constexpr auto BottomLinePen   = 2;
        } // namespace setterValueLabel

        namespace setterUnitLabel
        {
            constexpr auto X      = 0;
            constexpr auto Y      = setterValueLabel::Y + setterValueLabel::Height;
            constexpr auto Width  = timer::Width;
            constexpr auto Height = 40;
            constexpr auto Width     = 220;
            constexpr auto Height    = 20;
            constexpr auto TopMargin = 15;
        } // namespace setterUnitLabel

        namespace infoText


@@ 57,7 48,7 @@ namespace style::meditation
    namespace intervalBox
    {
        constexpr auto X      = style::window::default_left_margin;
        constexpr auto Y      = style::meditation::timer::Y + style::meditation::timer::Height + VerticalWidgetGap;
        constexpr auto Y      = style::meditation::timer::Y + 2 * style::meditation::timer::Radius + VerticalWidgetGap;
        constexpr auto Width  = style::window::default_body_width;
        constexpr auto Height = 60;



@@ 116,7 107,7 @@ namespace style::meditation
            constexpr auto X      = style::window::default_left_margin;
            constexpr auto Y      = style::window::default_vertical_pos;
            constexpr auto Width  = style::listview::body_width_with_scroll;
            constexpr auto Height = style::window_height - Y - style::footer::height;
            constexpr auto Height = style::window_height - Y - style::nav_bar::height;
        } // namespace window

    } // namespace listView

M module-apps/application-meditation/widgets/TimerProperty.cpp => module-apps/application-meditation/widgets/TimerProperty.cpp +23 -17
@@ 17,49 17,55 @@ TimerProperty::TimerProperty(Item *parent, const uint32_t x, const uint32_t y, c

void TimerProperty::build()
{
    const Point boxCenter(getX() + (getWidth() / 2), getY() + (getHeight() / 2));

    namespace timerStyle = style::meditation::timer;

    const Point boxCenter(getX() + (getWidth() / 2), getY() + (getHeight() / 2));
    Circle::ShapeParams params;
    params.setCenterPoint(boxCenter)
        .setRadius(timerStyle::Radius)
        .setBorderColor(timerStyle::BorderColor)
        .setFocusBorderColor(timerStyle::BorderColorOnFocused)
        .setFocusBorderColor(timerStyle::BorderColor)
        .setPenWidth(timerStyle::PenWidth)
        .setFocusPenWidth(timerStyle::PenWidth);
        .setFocusPenWidth(timerStyle::FocusPenWidth);
    circle = new Circle(this, params);

    namespace timerStyle = style::meditation::timer;
    timeLabel            = new Label(this,
                          timerStyle::setterValueLabel::X,
                          timerStyle::setterValueLabel::Y,
                          timerStyle::setterValueLabel::Width,
                          timerStyle::setterValueLabel::Height);
    centerBody = new VBox(this, 0, 0, 2 * timerStyle::Radius, 2 * timerStyle::Radius);
    centerBody->setAlignment(Alignment(Alignment::Horizontal::Center, Alignment::Vertical::Top));
    centerBody->setMinimumSize(2 * timerStyle::Radius, 2 * timerStyle::Radius);
    centerBody->setEdges(RectangleEdge::None);
    centerBody->activeItem = false;

    timeLabel = new Label(centerBody);
    timeLabel->setMargins(gui::Margins(0, timerStyle::setterValueLabel::TopMargin, 0, 0));
    timeLabel->setEdges(RectangleEdge::None);
    timeLabel->setMinimumSize(timerStyle::setterValueLabel::Width, timerStyle::setterValueLabel::Height);
    timeLabel->setFont(style::window::font::supersizemelight);
    timeLabel->setAlignment(Alignment(gui::Alignment::Horizontal::Center, gui::Alignment::Vertical::Center));
    timeLabel->setPenWidth(timerStyle::PenWidth);
    timeLabel->setText(std::to_string(static_cast<int>(state.getTime().count())));

    timeUnitLabel = new Label(this,
                              timerStyle::setterUnitLabel::X,
                              timerStyle::setterUnitLabel::Y,
                              timerStyle::setterUnitLabel::Width,
                              timerStyle::setterUnitLabel::Height);
    divRect = new Rect(centerBody, 0, 0, timerStyle::setterValueLabel::BottomLineWidth, 1);
    divRect->setPenWidth(timerStyle::setterValueLabel::BottomLinePen);

    timeUnitLabel = new Label(centerBody);
    timeUnitLabel->setMinimumSize(timerStyle::setterUnitLabel::Width, timerStyle::setterUnitLabel::Height);
    timeUnitLabel->setMargins(gui::Margins(0, timerStyle::setterUnitLabel::TopMargin, 0, 0));
    timeUnitLabel->setFont(style::window::font::verysmall);
    timeUnitLabel->setAlignment(Alignment(gui::Alignment::Horizontal::Center, gui::Alignment::Vertical::Center));
    timeUnitLabel->setEdges(RectangleEdge::None);
    timeUnitLabel->setText(utils::translate("app_meditation_minutes"));

    centerBody->resizeItems();
}

bool TimerProperty::onFocus(bool isFocused)
{
    circle->setFocus(isFocused);
    if (isFocused) {
        timeLabel->setEdges(RectangleEdge::Bottom);
        divRect->setEdges(RectangleEdge::Top);
    }
    else {
        timeLabel->setEdges(RectangleEdge::None);
        divRect->setEdges(RectangleEdge::None);
    }
    state.onFocus();
    return true;

M module-apps/application-meditation/widgets/TimerProperty.hpp => module-apps/application-meditation/widgets/TimerProperty.hpp +2 -0
@@ 42,7 42,9 @@ namespace gui
        } state;

        Circle *circle       = nullptr;
        VBox *centerBody     = nullptr;
        Label *timeLabel     = nullptr;
        Rect *divRect        = nullptr;
        Label *timeUnitLabel = nullptr;

        void build();

M module-apps/application-meditation/windows/MeditationTimerWindow.cpp => module-apps/application-meditation/windows/MeditationTimerWindow.cpp +2 -2
@@ 47,8 47,8 @@ void MeditationTimerWindow::buildInterface()

    timer = new MeditationTimer(style::meditation::timer::X,
                                style::meditation::timer::Y,
                                style::meditation::timer::Width,
                                style::meditation::timer::Height,
                                2 * style::meditation::timer::Radius,
                                2 * style::meditation::timer::Radius,
                                app,
                                this);


M module-apps/application-meditation/windows/MeditationWindow.cpp => module-apps/application-meditation/windows/MeditationWindow.cpp +2 -2
@@ 42,8 42,8 @@ namespace gui
        timeSetter = new TimerProperty(this,
                                       style::meditation::timer::X,
                                       style::meditation::timer::Y,
                                       style::meditation::timer::Width,
                                       style::meditation::timer::Height);
                                       2 * style::meditation::timer::Radius,
                                       2 * style::meditation::timer::Radius);
        timeSetter->setEdges(RectangleEdge::None);
        setFocusItem(timeSetter);


M module-apps/application-messages/data/MessagesStyle.hpp => module-apps/application-messages/data/MessagesStyle.hpp +2 -2
@@ 18,7 18,7 @@ namespace style
            inline constexpr uint32_t ListPositionY = style::window::default_vertical_pos - 1;
            // Bottom margin need to be added to fit all elements.
            inline constexpr uint32_t listHeight =
                style::window_height - ListPositionY - style::footer::height + style::margins::small;
                style::window_height - ListPositionY - style::nav_bar::height + style::margins::small;
            inline constexpr uint32_t listWidth = style::listview::body_width_with_scroll;
        } // namespace threads



@@ 111,7 111,7 @@ namespace style
            {
                inline constexpr uint32_t x = style::window::default_left_margin;
                inline constexpr uint32_t y = style::window::default_vertical_pos;
                inline constexpr uint32_t h = style::window_height - y - style::footer::height;
                inline constexpr uint32_t h = style::window_height - y - style::nav_bar::height;
                inline constexpr uint32_t w = style::listview::body_width_with_scroll;

            } // namespace list

M module-apps/application-messages/windows/MessagesMainWindow.cpp => module-apps/application-messages/windows/MessagesMainWindow.cpp +1 -1
@@ 73,7 73,7 @@ namespace gui
                                 0,
                                 style::window::default_vertical_pos,
                                 style::window_width,
                                 style::window_height - style::window::default_vertical_pos - style::footer::height,
                                 style::window_height - style::window::default_vertical_pos - style::nav_bar::height,
                                 "empty_list_add_W_G",
                                 utils::translate("app_messages_no_messages"));
        emptyListIcon->setVisible(false);

M module-apps/application-music-player/data/MusicPlayerStyle.hpp => module-apps/application-music-player/data/MusicPlayerStyle.hpp +1 -1
@@ 87,7 87,7 @@ namespace musicPlayerStyle
        constexpr uint32_t y = style::window::default_vertical_pos - 1;
        constexpr uint32_t w = style::listview::body_width_with_scroll;
        // Bottom margin need to be added to fit all elements.
        constexpr uint32_t h = style::window_height - y - style::footer::height + style::margins::small;
        constexpr uint32_t h = style::window_height - y - style::nav_bar::height + style::margins::small;
    } // namespace allSongsWindow

    namespace songItem

M module-apps/application-music-player/windows/MusicPlayerMainWindow.cpp => module-apps/application-music-player/windows/MusicPlayerMainWindow.cpp +7 -5
@@ 520,16 520,18 @@ namespace gui

        snprintf(timeToDisplay,
                 maxTimeToDisplaySize,
                 "%d:%02d",
                 static_cast<int>(currentTotalTime) / utils::time::secondsInMinute,
                 "%d:%02d:%02d",
                 static_cast<int>(currentTotalTime) / utils::time::secondsInHour,
                 static_cast<int>((currentTotalTime) % utils::time::secondsInHour) / 60,
                 static_cast<int>(currentTotalTime) % utils::time::secondsInMinute);
        currentTotalTimeString = timeToDisplay;

        auto elapsedTime = currentTotalTime * currentProgress;
        auto elapsedTime = static_cast<uint32_t>(currentTotalTime * currentProgress);
        snprintf(timeToDisplay,
                 maxTimeToDisplaySize,
                 "%d:%02d",
                 static_cast<int>(elapsedTime) / utils::time::secondsInMinute,
                 "%d:%02d:%02d",
                 static_cast<int>(elapsedTime) / utils::time::secondsInHour,
                 static_cast<int>((elapsedTime) % utils::time::secondsInHour) / 60,
                 static_cast<int>(elapsedTime) % utils::time::secondsInMinute);
        currentTimeString = timeToDisplay;


M module-apps/application-notes/windows/NoteMainWindow.cpp => module-apps/application-notes/windows/NoteMainWindow.cpp +1 -1
@@ 75,7 75,7 @@ namespace app::notes
                          0,
                          ::style::window::default_vertical_pos,
                          ::style::window_width,
                          ::style::window_height - ::style::window::default_vertical_pos - ::style::footer::height,
                          ::style::window_height - ::style::window::default_vertical_pos - ::style::nav_bar::height,
                          "empty_list_add_W_G",
                          utils::translate("app_notes_no_notes"));
        emptyListIcon->setVisible(false);

M module-apps/application-phonebook/data/PhonebookStyle.hpp => module-apps/application-phonebook/data/PhonebookStyle.hpp +6 -6
@@ 18,7 18,7 @@ namespace phonebookStyle
            inline constexpr uint32_t x = style::window::default_left_margin;
            inline constexpr uint32_t y = style::window::default_vertical_pos;
            inline constexpr uint32_t w = style::listview::body_width_with_scroll;
            inline constexpr uint32_t h = style::window_height - y - style::footer::height;
            inline constexpr uint32_t h = style::window_height - y - style::nav_bar::height;
        } // namespace contactsList
    }     // namespace mainWindow



@@ 29,7 29,7 @@ namespace phonebookStyle
            inline constexpr uint32_t x = style::window::default_left_margin;
            inline constexpr uint32_t y = style::window::default_vertical_pos;
            inline constexpr uint32_t w = style::listview::body_width_with_scroll;
            inline constexpr uint32_t h = style::window_height - y - style::footer::height;
            inline constexpr uint32_t h = style::window_height - y - style::nav_bar::height;
        } // namespace newContactsList
    }     // namespace newContactWindow



@@ 40,14 40,14 @@ namespace phonebookStyle
            inline constexpr uint32_t x = style::window::default_left_margin;
            inline constexpr uint32_t y = style::window::default_vertical_pos + 74;
            inline constexpr uint32_t w = style::listview::body_width_with_scroll;
            inline constexpr uint32_t h = style::window_height - y - style::footer::height;
            inline constexpr uint32_t h = style::window_height - y - style::nav_bar::height;
        } // namespace contactDetailsList
        namespace contactDetailsListNoFlags
        {
            inline constexpr uint32_t x = style::window::default_left_margin;
            inline constexpr uint32_t y = style::window::default_vertical_pos;
            inline constexpr uint32_t w = style::listview::body_width_with_scroll;
            inline constexpr uint32_t h = style::window_height - y - style::footer::height;
            inline constexpr uint32_t h = style::window_height - y - style::nav_bar::height;
        } // namespace contactDetailsListNoFlags

    } // namespace contactDetailsWindow


@@ 59,7 59,7 @@ namespace phonebookStyle
            inline constexpr uint32_t x = style::window::default_left_margin;
            inline constexpr uint32_t y = style::window::default_vertical_pos;
            inline constexpr uint32_t w = style::listview::body_width_with_scroll;
            inline constexpr uint32_t h = style::window_height - y - style::footer::height;
            inline constexpr uint32_t h = style::window_height - y - style::nav_bar::height;
        } // namespace searchResultList
    }     // namespace searchResultsWindow



@@ 70,7 70,7 @@ namespace phonebookStyle
            inline constexpr uint32_t x = style::window::default_left_margin;
            inline constexpr uint32_t y = style::window::default_vertical_pos;
            inline constexpr uint32_t w = style::listview::body_width_with_scroll;
            inline constexpr uint32_t h = style::window_height - y - style::footer::height;
            inline constexpr uint32_t h = style::window_height - y - style::nav_bar::height;
        } // namespace contactsListIce
    }     // namespace iceContactsWindow


M module-apps/application-phonebook/windows/PhonebookMainWindow.cpp => module-apps/application-phonebook/windows/PhonebookMainWindow.cpp +1 -1
@@ 53,7 53,7 @@ namespace gui
                          0,
                          ::style::window::default_vertical_pos,
                          ::style::window_width,
                          ::style::window_height - ::style::window::default_vertical_pos - ::style::footer::height,
                          ::style::window_height - ::style::window::default_vertical_pos - ::style::nav_bar::height,
                          "empty_list_add_W_G",
                          utils::translate("app_phonebook_no_contacts"));
        emptyListIcon->setVisible(false);

M module-apps/application-settings/models/apps/SoundsModel.cpp => module-apps/application-settings/models/apps/SoundsModel.cpp +0 -2
@@ 185,8 185,6 @@ void SoundsModel::applyItems(const std::vector<std::filesystem::path> &sounds,
                        utils::translate(style::strings::common::play), gui::nav_bar::Side::Left, false);
                    return true;
                }

                return false;
            };
            break;


M module-apps/application-settings/widgets/SettingsStyle.hpp => module-apps/application-settings/widgets/SettingsStyle.hpp +2 -2
@@ 47,7 47,7 @@ namespace style
                inline constexpr uint32_t x = style::window::default_left_margin;
                inline constexpr uint32_t y = style::window::default_vertical_pos;
                inline constexpr uint32_t w = style::listview::body_width_with_scroll;
                inline constexpr uint32_t h = style::window_height - y - style::footer::height;
                inline constexpr uint32_t h = style::window_height - y - style::nav_bar::height;
            } // namespace newApn

            namespace bluetooth


@@ 115,7 115,7 @@ namespace style
            inline constexpr auto X      = style::window::default_left_margin;
            inline constexpr auto Y      = style::window::default_vertical_pos;
            inline constexpr auto Width  = style::listview::body_width_with_scroll;
            inline constexpr auto Height = style::window_height - Y - style::footer::height;
            inline constexpr auto Height = style::window_height - Y - style::nav_bar::height;
        } // namespace list

    } // namespace quotes::categories

M module-apps/application-settings/widgets/advanced/ColorTestListStyle.hpp => module-apps/application-settings/widgets/advanced/ColorTestListStyle.hpp +1 -1
@@ 12,7 12,7 @@ namespace style::colorTest
        inline constexpr auto x      = style::window::default_left_margin;
        inline constexpr auto y      = style::window::default_vertical_pos;
        inline constexpr auto width  = style::listview::body_width_with_scroll;
        inline constexpr auto height = style::window_height - y - style::footer::height;
        inline constexpr auto height = style::window_height - y - style::nav_bar::height;
    } // namespace listview

    namespace item

M module-apps/application-settings/windows/apps/SoundSelectWindow.cpp => module-apps/application-settings/windows/apps/SoundSelectWindow.cpp +1 -1
@@ 36,7 36,7 @@ namespace gui
                                        style::window::default_vertical_pos - 1,
                                        style::listview::body_width_with_scroll,
                                        style::window_height - style::window::default_vertical_pos + 1 -
                                            style::footer::height + style::margins::small,
                                            style::nav_bar::height + style::margins::small,
                                        mSoundsModel,
                                        listview::ScrollBarType::Proportional);


M module-apps/application-settings/windows/display-keypad/QuotesMainWindow.cpp => module-apps/application-settings/windows/display-keypad/QuotesMainWindow.cpp +1 -1
@@ 16,7 16,7 @@ namespace style::quotes
        constexpr auto X      = style::window::default_left_margin;
        constexpr auto Y      = style::window::default_vertical_pos;
        constexpr auto Width  = style::listview::body_width_with_scroll;
        constexpr auto Height = style::window_height - Y - style::footer::height;
        constexpr auto Height = style::window_height - Y - style::nav_bar::height;
    } // namespace list
} // namespace style::quotes


M module-apps/application-settings/windows/network/ApnSettingsWindow.cpp => module-apps/application-settings/windows/network/ApnSettingsWindow.cpp +1 -1
@@ 28,7 28,7 @@ namespace gui
                                 0,
                                 style::window::default_vertical_pos,
                                 style::window_width,
                                 style::window_height - style::window::default_vertical_pos - style::footer::height,
                                 style::window_height - style::window::default_vertical_pos - style::nav_bar::height,
                                 "empty_list_add_W_G",
                                 utils::translate("app_settings_apn_settings_no_apns"));
        emptyListIcon->setVisible(false);

M module-apps/apps-common/audio/AbstractSoundsPlayer.hpp => module-apps/apps-common/audio/AbstractSoundsPlayer.hpp +2 -2
@@ 17,9 17,9 @@ class AbstractSoundsPlayer
        Stopped
    };

    using AudioEofCallback = std::function<void()>;
    using AudioStoppedCallback = std::function<void()>;

    virtual bool play(const std::string &path, AudioEofCallback cb = nullptr) = 0;
    virtual bool play(const std::string &path, AudioStoppedCallback cb = nullptr) = 0;
    virtual bool pause()                                                      = 0;
    virtual bool resume()                                                     = 0;
    virtual bool stop()                                                       = 0;

M module-apps/apps-common/audio/SoundsPlayer.cpp => module-apps/apps-common/audio/SoundsPlayer.cpp +6 -6
@@ 7,9 7,9 @@ SoundsPlayer::SoundsPlayer(app::ApplicationCommon *app)
    : audioOperations{std::make_unique<app::AsyncAudioOperations>(app)}
{}

bool SoundsPlayer::play(const std::string &path, AudioEofCallback cb)
bool SoundsPlayer::play(const std::string &path, AudioStoppedCallback cb)
{
    eofCallback = nullptr;
    audioStoppedCallback = nullptr;
    return audioOperations->play(path, [this, path, cb](audio::RetCode retCode, audio::Token token) {
        if (retCode != audio::RetCode::Success || !token.IsValid()) {
            LOG_ERROR("Audio preview callback failed with retcode = %s. Token validity: %d",


@@ 20,7 20,7 @@ bool SoundsPlayer::play(const std::string &path, AudioEofCallback cb)
        currentState = State::Playing;
        currentToken = token;
        currentPath  = path;
        eofCallback  = cb;
        audioStoppedCallback = cb;
    });
}



@@ 62,7 62,7 @@ bool SoundsPlayer::resume()

bool SoundsPlayer::stop()
{
    eofCallback = nullptr;
    audioStoppedCallback = nullptr;

    if (currentToken.IsValid()) {
        return audioOperations->stop(currentToken,


@@ 75,8 75,8 @@ bool SoundsPlayer::stop(audio::Token token)
{
    if (currentToken.IsValid() && currentToken == token) {
        currentState = State::Stopped;
        if (eofCallback != nullptr) {
            eofCallback();
        if (audioStoppedCallback != nullptr) {
            audioStoppedCallback();
        }
        return true;
    }

M module-apps/apps-common/audio/SoundsPlayer.hpp => module-apps/apps-common/audio/SoundsPlayer.hpp +2 -2
@@ 11,7 11,7 @@ class SoundsPlayer : public AbstractSoundsPlayer
    explicit SoundsPlayer(app::ApplicationCommon *app);
    virtual ~SoundsPlayer() = default;

    bool play(const std::string &path, AudioEofCallback cb = nullptr) override;
    bool play(const std::string &path, AudioStoppedCallback cb = nullptr) override;
    bool pause() override;
    bool resume() override;
    bool stop() override;


@@ 25,5 25,5 @@ class SoundsPlayer : public AbstractSoundsPlayer
    audio::Token currentToken;
    std::string currentPath;

    AudioEofCallback eofCallback{nullptr};
    AudioStoppedCallback audioStoppedCallback{nullptr};
};

M module-apps/apps-common/popups/PowerOffWindow.cpp => module-apps/apps-common/popups/PowerOffWindow.cpp +0 -3
@@ 28,9 28,6 @@ namespace gui
        metadata.icon  = "turn_off_W_G";
        auto msg       = std::make_unique<DialogMetadataMessage>(std::move(metadata));
        DialogYesNo::onBeforeShow(mode, msg.get());

        navBar->setActive(nav_bar::Side::Center, false);
        navBar->setActive(nav_bar::Side::Right, false);
    }

} /* namespace gui */

M module-apps/apps-common/widgets/BellSideListItem.cpp => module-apps/apps-common/widgets/BellSideListItem.cpp +1 -1
@@ 32,7 32,7 @@ namespace gui
        bottomText->setEdges(RectangleEdge::None);
        bottomText->activeItem = false;
        bottomText->setAlignment(Alignment(Alignment::Horizontal::Center, Alignment::Vertical::Center));
        bottomText->setText(description);
        bottomText->setRichText(description);
        bottomText->drawUnderline(false);
    }


M module-apps/apps-common/widgets/DateAndTimeStyle.hpp => module-apps/apps-common/widgets/DateAndTimeStyle.hpp +1 -1
@@ 15,5 15,5 @@ namespace style::window::date_and_time
    inline constexpr auto listView_x       = style::window::default_left_margin;
    inline constexpr auto listView_y       = style::window::default_vertical_pos;
    inline constexpr auto listView_w       = style::listview::body_width_with_scroll;
    inline constexpr auto listView_h       = style::window_height - listView_y - style::footer::height;
    inline constexpr auto listView_h       = style::window_height - listView_y - style::nav_bar::height;
} // namespace style::window::date_and_time

M module-apps/apps-common/windows/AppWindow.cpp => module-apps/apps-common/windows/AppWindow.cpp +5 -1
@@ 51,7 51,11 @@ namespace gui
                                         style::header::width,
                                         style::header::height);

        navBar = new gui::nav_bar::NavBar(this, 0, style::window_height - 51, style::window_width, 50);
        navBar = new gui::nav_bar::NavBar(this,
                                          style::nav_bar::default_horizontal_pos,
                                          style::nav_bar::default_vertical_pos,
                                          style::nav_bar::width,
                                          style::nav_bar::height);
        navBar->setActive(nav_bar::Side::Left, false);
        navBar->setActive(nav_bar::Side::Center, false);
        navBar->setActive(nav_bar::Side::Right, false);

M module-bluetooth/Bluetooth/interface/BluetoothDriverImpl.cpp => module-bluetooth/Bluetooth/interface/BluetoothDriverImpl.cpp +1 -1
@@ 215,7 215,7 @@ namespace bluetooth
    }
    auto Driver::pair(Devicei device, std::uint8_t protectionLevel) -> bool
    {
        LOG_FATAL("Device: %s, addr: %s", device.name.c_str(), device.address_str());
        LOG_INFO("Device: %s, addr: %s", device.name.c_str(), device.address_str());
        return gap->pair(device, protectionLevel);
    }
    auto Driver::unpair(Devicei device) -> bool

M module-bluetooth/Bluetooth/interface/profiles/HFP/HFP.cpp => module-bluetooth/Bluetooth/interface/profiles/HFP/HFP.cpp +1 -0
@@ 276,6 276,7 @@ namespace bluetooth
            scoHandle = HCI_CON_HANDLE_INVALID;
            isAudioRouted                = false;
            isAudioConnectionEstablished = false;
            sendAudioEvent(audio::EventType::BlutoothHFPDeviceState, audio::Event::DeviceState::Disconnected);
            break;
        case HFP_SUBEVENT_START_RINGING:
            LOG_DEBUG("Start Ringing\n");

M module-bluetooth/Bluetooth/interface/profiles/HSP/HSP.cpp => module-bluetooth/Bluetooth/interface/profiles/HSP/HSP.cpp +1 -0
@@ 215,6 215,7 @@ namespace bluetooth
            LOG_DEBUG("Audio connection released.\n\n");
            scoHandle    = HCI_CON_HANDLE_INVALID;
            callAnswered = false;
            sendAudioEvent(audio::EventType::BlutoothHSPDeviceState, audio::Event::DeviceState::Disconnected);
            break;
        case HSP_SUBEVENT_MICROPHONE_GAIN_CHANGED:
            LOG_DEBUG("Received microphone gain change %d\n", hsp_subevent_microphone_gain_changed_get_gain(event));

M module-bluetooth/Bluetooth/interface/profiles/SCO/SCO.cpp => module-bluetooth/Bluetooth/interface/profiles/SCO/SCO.cpp +1 -4
@@ 127,10 127,7 @@ auto SCO::SCOImpl::audioInitialize(int sampleRate) -> Error
    metadata.channels        = 1;
    metadata.samplesPerFrame = audioSamplesPerPacket;

    if (sourceQueue != nullptr && sinkQueue != nullptr) {
        sendEvent(audio::EventType::BlutoothHSPDeviceState, audio::Event::DeviceState::Connected);
    }
    else {
    if (sourceQueue == nullptr || sinkQueue == nullptr) {
        LOG_ERROR("failed to create queue!");
        return Error(Error::SystemError);
    }

M module-bsp/board/rt1051/bellpx/board/BoardDefinitions.hpp => module-bsp/board/rt1051/bellpx/board/BoardDefinitions.hpp +2 -2
@@ 147,8 147,8 @@ enum class BoardDefinitions

    BELL_SWITCHES_GPIO   = static_cast<int>(drivers::GPIOInstances ::GPIO_2),
    BELL_SWITCHES_CENTER = 16, // GPIO_B1_00
    BELL_SWITCHES_LEFT   = 24, // GPIO_B1_08
    BELL_SWITCHES_RIGHT  = 25, // GPIO_B1_09
    BELL_SWITCHES_RIGHT  = 24, // GPIO_B1_08
    BELL_SWITCHES_LEFT   = 25, // GPIO_B1_09
    BELL_SWITCHES_LATCH  = 26, // GPIO_B1_10
    BELL_SWITCHES_DOME   = 27, // GPIO_B1_11


M module-gui/gui/core/FontManager.cpp => module-gui/gui/core/FontManager.cpp +2 -0
@@ 142,7 142,9 @@ namespace gui
        auto font = find(name);
        // default return first font
        if (font == nullptr && fonts.size() > 0) {
#if DEBUG_MISSING_ASSETS == 1
            LOG_ERROR("=> font not found: %s using default", name.data());
#endif
            return fonts[0];
        }
        return font;

M module-gui/gui/core/ImageManager.cpp => module-gui/gui/core/ImageManager.cpp +4 -0
@@ 240,7 240,9 @@ namespace gui
    ImageMap *ImageManager::getImageMap(uint32_t id)
    {
        if (id >= imageMaps.size()) {
#if DEBUG_MISSING_ASSETS == 1
            LOG_ERROR("Unable to find an image by id: %" PRIu32, id);
#endif
            return imageMaps[fallbackImageId];
        }
        return imageMaps[id];


@@ 254,7 256,9 @@ namespace gui
                return i;
            }
        }
#if DEBUG_MISSING_ASSETS == 1
        LOG_ERROR("Unable to find an image: %s , using deafult fallback image instead.", name.c_str());
#endif
        return fallbackImageId;
    }


M module-gui/gui/widgets/Label.cpp => module-gui/gui/widgets/Label.cpp +3 -2
@@ 271,12 271,13 @@ namespace gui
        textColor = color;
    }

    uint32_t Label::getTextNeedSpace() const noexcept
    uint32_t Label::getTextNeedSpace(const UTF8 &_text) const noexcept
    {
        if (font == nullptr) {
            return 0;
        }
        return font->getPixelWidth(text);

        return _text.empty() ? font->getPixelWidth(text) : font->getPixelWidth(_text);
    }

    uint32_t Label::getTextHeight() const noexcept

M module-gui/gui/widgets/Label.hpp => module-gui/gui/widgets/Label.hpp +1 -1
@@ 126,7 126,7 @@ namespace gui
        RawFont *getFont() const noexcept;
        // virtual methods
        void buildDrawListImplementation(std::list<Command> &commands) override;
        uint32_t getTextNeedSpace() const noexcept;
        uint32_t getTextNeedSpace(const UTF8 &text = "") const noexcept;
        /// line: height
        uint32_t getTextHeight() const noexcept;
        uint32_t getTextWidth() const noexcept;

M module-gui/gui/widgets/NavBar.cpp => module-gui/gui/widgets/NavBar.cpp +123 -71
@@ 10,74 10,62 @@

namespace gui::nav_bar
{
    NavBar::NavBar()
    NavBar::NavBar(Item *parent, uint32_t x, uint32_t y, uint32_t w, uint32_t h)
        : HThreeBox<HBox, HBox, HBox>(parent, x, y, w, h)
    {
        setEdges(RectangleEdge::None);

        Padding margins{style::window::navBar::leftMargin, 0, style::window::navBar::rightMargin, 0};
        left   = prepareLabel(Side::Left);
        center = prepareLabel(Side::Center);
        right  = prepareLabel(Side::Right);
        firstBox = new HBox(this);
        firstBox->setMinimumHeight(h);
        firstBox->setAlignment(Alignment(Alignment::Horizontal::Left, gui::Alignment::Vertical::Center));
        firstBox->setMargins({style::nav_bar::left_margin, 0, 0, 0});
        firstBox->setEdges(RectangleEdge::None);

        left->setPadding(margins);
        center->setPadding(margins);
        right->setPadding(margins);
        centerBox = new HBox(this);
        centerBox->setEdges(RectangleEdge::None);
        centerBox->setAlignment(Alignment(gui::Alignment::Horizontal::Center, gui::Alignment::Vertical::Center));
        centerBox->setMaximumSize(w, h);

        addWidget(left);
        addWidget(center);
        addWidget(right);
        lastBox = new HBox(this);
        lastBox->setMinimumHeight(h);
        lastBox->setAlignment(Alignment(Alignment::Horizontal::Right, gui::Alignment::Vertical::Center));
        lastBox->setMargins({0, 0, style::nav_bar::right_margin, 0});
        lastBox->setEdges(RectangleEdge::None);

        setFillColor(ColorFullWhite);
        setBorderColor(ColorNoColor);
        setFilled(true);
        setSize(style::window::navBar::w, style::window::navBar::h);
    }
    NavBar::NavBar(Item *parent, uint32_t x, uint32_t y, uint32_t w, uint32_t h) : Rect{parent, x, y, w, h}
    {

        Padding margins{style::window::navBar::leftMargin, 0, style::window::navBar::rightMargin, 0};
        left   = prepareLabel(Side::Left);
        center = prepareLabel(Side::Center);
        right  = prepareLabel(Side::Right);
        createLabels();

        left->setPadding(margins);
        center->setPadding(margins);
        right->setPadding(margins);

        addWidget(left);
        addWidget(center);
        addWidget(right);

        setFillColor(ColorFullWhite);
        setBorderColor(ColorNoColor);
        setFilled(true);
        setSize(style::window::navBar::w, style::window::navBar::h);
        updateDrawArea();
        resizeItems();
    }
    NavBar::~NavBar()
    {}

    gui::Label *NavBar::prepareLabel(nav_bar::Side side)
    void NavBar::createLabels()
    {
        Label *label = new Label(this, 0, 0, 0, 0);
        label->setBorderColor(Color{15, 15});
        switch (side) {
        case Side::Left:
            label->setAlignment(gui::Alignment(gui::Alignment::Horizontal::Left, gui::Alignment::Vertical::Center));
            label->setFont(style::footer::font::medium);
            break;
        case Side::Center:
            label->setAlignment(gui::Alignment(gui::Alignment::Horizontal::Center, gui::Alignment::Vertical::Center));
            label->setFont(style::footer::font::bold);
            break;
        case Side::Right:
            label->setAlignment(gui::Alignment(gui::Alignment::Horizontal::Right, gui::Alignment::Vertical::Center));
            label->setFont(style::footer::font::medium);
            break;
        };

        label->setFilled(false);

        return label;
        left = new Label(firstBox);
        left->setAlignment(Alignment(Alignment::Horizontal::Left, gui::Alignment::Vertical::Bottom));
        left->setPadding({0, 0, 0, style::nav_bar::bottom_padding});
        left->setMinimumHeight(widgetArea.h);
        left->setFont(style::nav_bar::font::medium);
        left->setEllipsis(Ellipsis::Right);
        left->setVisible(true);
        left->setEdges(RectangleEdge::None);

        center = new Label(centerBox);
        center->setAlignment(Alignment(gui::Alignment::Horizontal::Center, gui::Alignment::Vertical::Center));
        center->setPadding({0, 0, 0, style::nav_bar::bottom_padding});
        center->setMinimumHeight(widgetArea.h);
        center->setMaximumWidth(widgetArea.w);
        center->setFont(style::nav_bar::font::bold);
        center->setEllipsis(Ellipsis::Right);
        center->setVisible(true);
        center->setEdges(RectangleEdge::None);

        right = new Label(lastBox);
        right->setAlignment(Alignment(Alignment::Horizontal::Right, gui::Alignment::Vertical::Center));
        right->setPadding({0, 0, 0, style::nav_bar::bottom_padding});
        right->setMinimumHeight(widgetArea.h);
        right->setFont(style::nav_bar::font::medium);
        right->setEllipsis(Ellipsis::Right);
        right->setVisible(true);
        right->setEdges(RectangleEdge::None);
    }

    Label *NavBar::getSide(nav_bar::Side side)


@@ 93,9 81,78 @@ namespace gui::nav_bar
        return nullptr;
    }

    bool NavBar::checkSideOccupied(nav_bar::Side side)
    {
        return getSide(side)->visible && !getSide(side)->getText().empty();
    }

    Length NavBar::outerSideUsedWidth(nav_bar::Side side)
    {
        return getSide(side)->visible ? getSide(side)->getTextNeedSpace() : 0;
    }

    void NavBar::setLeftSideWidth(Length width)
    {
        left->setMinimumWidth(width);
        firstBox->setMinimumWidth(width);
        firstBox->setMaximumWidth(width);
    }

    void NavBar::setRightSideWidth(Length width)
    {
        right->setMinimumWidth(width);
        lastBox->setMinimumWidth(width);
        lastBox->setMaximumWidth(width);
    }

    void NavBar::applyOuterSidesWidth(nav_bar::Side side, const UTF8 &str)
    {
        Length widthToSet = 0U;
        if (side == Side::Left) {
            widthToSet = std::max(outerSideUsedWidth(Side::Right), left->visible ? left->getTextNeedSpace(str) : 0);
        }
        else if (side == Side::Right) {
            widthToSet = std::max(outerSideUsedWidth(Side::Left), right->visible ? right->getTextNeedSpace(str) : 0);
        }
        else {
            widthToSet = std::max(outerSideUsedWidth(Side::Left), outerSideUsedWidth(Side::Right));
        }

        // If other side active set maximum for side to print into
        auto widthReduced = false;
        if ((side == Side::Left && !str.empty() &&
             (checkSideOccupied(Side::Right) || checkSideOccupied(Side::Center))) ||
            (side == Side::Right && !str.empty() &&
             (checkSideOccupied(Side::Left) || checkSideOccupied(Side::Center))) ||
            (side == Side::Center && !str.empty() &&
             (checkSideOccupied(Side::Left) || checkSideOccupied(Side::Right)))) {

            widthReduced = true;
            widthToSet =
                std::min(widthToSet, (widgetArea.w - (style::nav_bar::left_margin + style::nav_bar::right_margin)) / 3);
        }

        if (widthReduced) {
            setLeftSideWidth(widthToSet);
            setRightSideWidth(widthToSet);
        }
        else if (side == Side::Left && !str.empty()) {
            setLeftSideWidth(widthToSet);
            setRightSideWidth(0);
        }
        else if (side == Side::Right && !str.empty()) {
            setRightSideWidth(widthToSet);
            setLeftSideWidth(0);
        }
    }

    void NavBar::setActive(nav_bar::Side side, bool active)
    {
        getSide(side)->setVisible(active);
        auto selectedSide = getSide(side);

        selectedSide->setVisible(active);
        applyOuterSidesWidth(side, selectedSide->getText());
        selectedSide->informContentChanged();
    }

    bool NavBar::isActive(nav_bar::Side side)


@@ 105,8 162,12 @@ namespace gui::nav_bar

    void NavBar::setText(nav_bar::Side side, const UTF8 &str, bool active)
    {
        getSide(side)->setText(str);
        setActive(side, active);
        auto selectedSide = getSide(side);
        selectedSide->setVisible(active);

        applyOuterSidesWidth(side, str);
        selectedSide->setText(str);
        selectedSide->informContentChanged();
    }

    UTF8 NavBar::getText(nav_bar::Side side)


@@ 114,15 175,6 @@ namespace gui::nav_bar
        return getSide(side)->getText();
    }

    bool NavBar::onDimensionChanged(const BoundingBox &oldDim, const BoundingBox &newDim)
    {
        Rect::onDimensionChanged(oldDim, newDim);
        left->setSize(newDim.w, newDim.h);
        center->setSize(newDim.w, newDim.h);
        right->setSize(newDim.w, newDim.h);
        return true;
    }

    void NavBar::store()
    {
        store(Side::Left);

M module-gui/gui/widgets/NavBar.hpp => module-gui/gui/widgets/NavBar.hpp +9 -7
@@ 23,7 23,7 @@ namespace gui::nav_bar
    /// left is left action key, center describes center (enter) key, and right right action key
    /// depending on screen selected elements will be visible
    /// @note when in Text widget it will show input mode if enabled in [ left ] area
    class NavBar : public Rect
    class NavBar : public HThreeBox<HBox, HBox, HBox>
    {
      protected:
        struct Cache


@@ 54,27 54,29 @@ namespace gui::nav_bar
        Label *left   = nullptr;
        Label *center = nullptr;
        Label *right  = nullptr;
        gui::Label *prepareLabel(nav_bar::Side side);
        void createLabels();

        void setLeftSideWidth(Length width);
        void setRightSideWidth(Length width);
        bool checkSideOccupied(nav_bar::Side side);
        Length outerSideUsedWidth(nav_bar::Side side);
        void applyOuterSidesWidth(nav_bar::Side side, const UTF8 &str);
        Label *getSide(nav_bar::Side side);

      public:
        NavBar();
        NavBar(Item *parent, uint32_t x, uint32_t y, uint32_t w, uint32_t h);
        virtual ~NavBar();

        void setActive(nav_bar::Side side, bool active);
        bool isActive(nav_bar::Side side);
        void setText(nav_bar::Side side, const UTF8 &str, bool active = true);
        UTF8 getText(nav_bar::Side side);
        void setFont(Side side, const UTF8 &fontName);

        void store();
        void store(Side side);
        void restore();
        void restore(Side side);

        void setFont(Side side, const UTF8 &fontName);

        bool onDimensionChanged(const BoundingBox &oldDim, const BoundingBox &newDim) override;
        void accept(GuiVisitor &visitor) override;
    };


M module-gui/gui/widgets/Style.hpp => module-gui/gui/widgets/Style.hpp +22 -23
@@ 27,16 27,16 @@ namespace style
        inline constexpr auto default_horizontal_pos  = 20U;
        inline constexpr auto default_vertical_pos    = 0U;
        inline constexpr unsigned status_bar_margin_w = default_horizontal_pos * 2;
        inline constexpr auto height                  = 46U;
        inline constexpr auto width                   = window_width - status_bar_margin_w;
        inline constexpr auto height                  = 46U;
    } // namespace status_bar

    namespace header
    {
        inline constexpr auto default_horizontal_pos = 0U;
        inline constexpr auto default_vertical_pos   = status_bar::height;
        inline constexpr auto height                 = 59U;
        inline constexpr auto width                  = window_width;
        inline constexpr auto height                 = 59U;

        namespace font
        {


@@ 44,16 44,6 @@ namespace style
        } // namespace font
    }     // namespace header

    namespace footer
    {
        inline constexpr auto height = 54U;
        namespace font
        {
            inline constexpr auto bold   = "gt_pressura_bold_24";
            inline constexpr auto medium = "gt_pressura_regular_24";
        }; // namespace font
    };     // namespace footer

    namespace window
    {
        inline constexpr auto default_vertical_pos = header::default_vertical_pos + header::height;


@@ 61,8 51,7 @@ namespace style
        inline constexpr auto default_right_margin = 20U;
        inline constexpr auto default_body_width =
            style::window_width - style::window::default_right_margin - style::window::default_left_margin;
        inline constexpr auto default_body_height =
            style::window_height - style::window::default_vertical_pos - style::footer::height;
        inline constexpr auto default_body_height          = 441U;
        inline constexpr auto default_border_focus_w       = 2U;
        inline constexpr auto default_border_rect_no_focus = 1U;
        inline constexpr auto default_border_no_focus_w    = 0U;


@@ 103,15 92,6 @@ namespace style
        /// minimal label decoration for Option
        void decorateOption(gui::Label *el);

        namespace navBar
        {
            inline constexpr auto leftMargin  = 30U;
            inline constexpr auto rightMargin = 30U;

            inline constexpr auto h = 54U;
            inline constexpr auto w = window_width;
        } // namespace navBar

        namespace progressBar
        {
            inline constexpr auto x     = style::window::default_left_margin;


@@ 122,6 102,25 @@ namespace style
        }; // namespace progressBar
    };     // namespace window

    namespace nav_bar
    {
        inline constexpr auto default_horizontal_pos = 0U;
        inline constexpr auto default_vertical_pos   = window::default_vertical_pos + window::default_body_width;
        inline constexpr auto width                  = window_width;
        inline constexpr auto height                 = 54U;

        inline constexpr auto bottom_padding = 16U;
        inline constexpr auto left_margin    = 30U;
        inline constexpr auto right_margin   = 30U;

        namespace font
        {
            inline constexpr auto bold   = "gt_pressura_bold_24";
            inline constexpr auto medium = "gt_pressura_regular_24";
        }; // namespace font

    } // namespace nav_bar

    namespace settings
    {
        namespace date

M module-services/service-evtmgr/EventManager.cpp => module-services/service-evtmgr/EventManager.cpp +5 -0
@@ 118,6 118,11 @@ sys::MessagePointer EventManagerCommon::DataReceivedHandler(sys::DataMessage *ms
                bluetooth::AudioProfile::HSP, (event->getDeviceState() == audio::Event::DeviceState::Connected));
            bus.sendUnicast(message, app::name_settings);
        } break;
        case audio::EventType::BlutoothHFPDeviceState: {
            auto message = std::make_shared<message::bluetooth::ProfileStatus>(
                bluetooth::AudioProfile::HFP, (event->getDeviceState() == audio::Event::DeviceState::Connected));
            bus.sendUnicast(message, app::name_settings);
        } break;
        default:
            break;
        }

M module-utils/log/api/log/debug.hpp => module-utils/log/api/log/debug.hpp +1 -0
@@ 18,3 18,4 @@
#define DEBUG_TIMER                  0 /// debug timers system utility
#define DEBUG_SETTINGS_DB            0 /// show extensive settings logs for all applications
#define DEBUG_SERVICE_CELLULAR       0 /// show various logs in cellular service
#define DEBUG_MISSING_ASSETS         1 /// show debug concerning missing assets

M products/BellHybrid/apps/application-bell-alarm/windows/BellAlarmSetWindow.cpp => products/BellHybrid/apps/application-bell-alarm/windows/BellAlarmSetWindow.cpp +2 -1
@@ 14,7 14,8 @@ namespace gui
{
    BellAlarmSetWindow::BellAlarmSetWindow(app::ApplicationCommon *app,
                                           std::shared_ptr<app::bell_alarm::BellAlarmSetContract::Presenter> presenter)
        : WindowWithTimer(app, gui::window::name::bellAlarmSet), presenter{std::move(presenter)}
        : WindowWithTimer(app, gui::window::name::bellAlarmSet, alarmSummaryDisplayDuration), presenter{
                                                                                                  std::move(presenter)}
    {
        buildInterface();
    }

M products/BellHybrid/apps/application-bell-alarm/windows/BellAlarmSetWindow.hpp => products/BellHybrid/apps/application-bell-alarm/windows/BellAlarmSetWindow.hpp +1 -0
@@ 24,6 24,7 @@ namespace gui
        void onBeforeShow(ShowMode mode, SwitchData *data) override;

      private:
        constexpr static auto alarmSummaryDisplayDuration = std::chrono::seconds{5};
        std::shared_ptr<app::bell_alarm::BellAlarmSetContract::Presenter> presenter;
        Icon *icon{};
    };

M products/BellHybrid/apps/application-bell-onboarding/ApplicationBellOnBoarding.cpp => products/BellHybrid/apps/application-bell-onboarding/ApplicationBellOnBoarding.cpp +1 -1
@@ 135,7 135,7 @@ namespace app
    {
        auto [icon, text] = getDisplayDataFromState();
        switchWindow(gui::window::name::informationOnBoardingWindow,
                     gui::BellFinishedWindowData::Factory::create(icon, windowToReturn));
                     gui::BellFinishedWindowData::Factory::create(icon, windowToReturn, utils::translate(text)));
    }

    OnBoarding::InformationDisplay ApplicationBellOnBoarding::getDisplayDataFromState()

M products/BellHybrid/apps/application-bell-onboarding/windows/OnBoardingFinalizeWindow.cpp => products/BellHybrid/apps/application-bell-onboarding/windows/OnBoardingFinalizeWindow.cpp +2 -1
@@ 39,6 39,7 @@ namespace gui
        BellFinishedWindow::onBeforeShow(mode, data);

        icon->image->set("bell_big_logo", ImageTypeSpecifier::W_G);
        icon->text->setRichText(utils::translate("app_bell_onboarding_finalize"));
        icon->text->setFont(style::window::font::verybiglight);
        icon->text->setText(utils::translate("app_bell_onboarding_finalize"));
    }
} // namespace gui

M products/BellHybrid/apps/application-bell-settings/models/alarm_settings/SnoozeListItemProvider.cpp => products/BellHybrid/apps/application-bell-settings/models/alarm_settings/SnoozeListItemProvider.cpp +11 -11
@@ 25,11 25,7 @@ namespace app::bell_settings

        auto onOff =
            new OnOffListItem(model.getSnoozeOnOff(), utils::translate("app_bell_settings_alarm_settings_snooze"));
        onOff->onExit = [onOff, this]() {
            if (not onOff->isActive()) {
                this->onExit();
            }
        };

        internalData.emplace_back(onOff);
        constexpr auto snoozeLengthStep = 1U;
        constexpr auto snoozeLengthMin  = 1U;


@@ 51,6 47,11 @@ namespace app::bell_settings
                chimeLength->setBottomDescribtionText(utils::translate("common_minutes_lower"));
            }
        });
        chimeLength->onEnter = [onOff, this]() {
            if (not onOff->isActive()) {
                this->onExit();
            }
        };

        internalData.emplace_back(chimeLength);



@@ 66,11 67,6 @@ namespace app::bell_settings
            range,
            utils::translate("app_bell_settings_alarm_settings_snooze_chime_interval"),
            utils::translate("app_bell_settings_alarm_settings_snooze_chime_interval_bot_desc"));
        chimeInterval->onExit = [chimeInterval, this] {
            if (chimeInterval->isOff()) {
                this->onExit();
            }
        };
        internalData.emplace_back(chimeInterval);

        auto snoozeChimeTone = new UTF8ListItem(model.getSnoozeChimeTone(),


@@ 81,7 77,11 @@ namespace app::bell_settings
                onToneChange(val);
            }
        });
        snoozeChimeTone->onEnter = [this, snoozeChimeTone]() {
        snoozeChimeTone->onEnter = [this, snoozeChimeTone, chimeInterval]() {
            if (chimeInterval->isOff()) {
                this->onExit();
                return;
            }
            if (onToneEnter) {
                onToneEnter(snoozeChimeTone->getCurrentValue());
            }

M products/BellHybrid/apps/common/include/common/data/BellFinishedWindowSwitchData.hpp => products/BellHybrid/apps/common/include/common/data/BellFinishedWindowSwitchData.hpp +6 -4
@@ 14,20 14,22 @@ namespace gui
        struct Factory
        {
            static std::unique_ptr<BellFinishedWindowData> create(const UTF8 &icon,
                                                                  const std::string &windowToReturn)
                                                                  const std::string &windowToReturn,
                                                                  const UTF8 &text = "")
            {
                return std::unique_ptr<BellFinishedWindowData>(new BellFinishedWindowData(icon, windowToReturn));
                return std::unique_ptr<BellFinishedWindowData>(new BellFinishedWindowData(icon, windowToReturn, text));
            }
        };

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

      private:
        BellFinishedWindowData() = default;

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

M products/BellHybrid/apps/common/src/windows/BellFinishedWindow.cpp => products/BellHybrid/apps/common/src/windows/BellFinishedWindow.cpp +2 -0
@@ 30,6 30,7 @@ namespace gui
        if (icon == nullptr) {
            icon = new Icon(this, 0, 0, style::window_width, style::window_height, {}, {});
            icon->setAlignment(Alignment(Alignment::Horizontal::Center, Alignment::Vertical::Center));
            icon->text->setFont(style::window::font::verybiglight);
        }
    }



@@ 48,6 49,7 @@ namespace gui

        if (auto metadata = dynamic_cast<BellFinishedWindowData *>(data)) {
            icon->image->set(metadata->icon);
            icon->text->setRichText(metadata->text);
            icon->resizeItems();
            windowToReturn = metadata->windowToReturn;
        }

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

        auto instructionText = new TextFixedSize(informationBody);
        instructionText->setMargins(Margins(0, sun_logo_margin_top, 0, 0));
        instructionText->setFont(style::window::font::largelight);
        instructionText->setAlignment(Alignment(Alignment::Horizontal::Left, Alignment::Vertical::Center));
        instructionText->drawUnderline(false);
        instructionText->setFont(style::window::font::verybiglight);

M products/BellHybrid/services/evtmgr/internal/key_sequences/AlarmActivateSequence.hpp => products/BellHybrid/services/evtmgr/internal/key_sequences/AlarmActivateSequence.hpp +3 -3
@@ 3,11 3,11 @@

#pragma once

#include "ReleaseSequence.hpp"
#include "MovedSequence.hpp"

class AlarmActivateSequence : public ReleaseSequence
class AlarmActivateSequence : public MovedSequence
{
  public:
    AlarmActivateSequence() : ReleaseSequence(KeyMap::DeepPressUp)
    AlarmActivateSequence() : MovedSequence(KeyMap::DeepPressUp)
    {}
};

M products/BellHybrid/services/evtmgr/internal/key_sequences/AlarmDeactivateSequence.hpp => products/BellHybrid/services/evtmgr/internal/key_sequences/AlarmDeactivateSequence.hpp +3 -3
@@ 3,11 3,11 @@

#pragma once

#include "ReleaseSequence.hpp"
#include "MovedSequence.hpp"

class AlarmDeactivateSequence : public ReleaseSequence
class AlarmDeactivateSequence : public MovedSequence
{
  public:
    AlarmDeactivateSequence() : ReleaseSequence(KeyMap::DeepPressDown)
    AlarmDeactivateSequence() : MovedSequence(KeyMap::DeepPressDown)
    {}
};

A products/BellHybrid/services/evtmgr/internal/key_sequences/MovedSequence.hpp => products/BellHybrid/services/evtmgr/internal/key_sequences/MovedSequence.hpp +28 -0
@@ 0,0 1,28 @@
// 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 "AbstractKeySequence.hpp"
#include <keymap/KeyMap.hpp>

class MovedSequence : public AbstractKeySequence
{
  public:
    explicit MovedSequence(KeyMap key) : mappedKey{key}
    {}
    void process(const RawKey &key) override
    {
        if (mapKey(static_cast<gui::KeyCode>(key.keyCode)) != mappedKey) {
            return;
        }

        if (key.state == RawKey::State::Moved) {
            trigger();
            ready();
        }
    }

  private:
    KeyMap mappedKey;
};