Skip to content

Commit a2779d9

Browse files
[BH-1594] Add shortcuts instruction
Shortcuts instruction is a new functionality during the Onboarding process. It shows hints on how to use buttons.
1 parent d6fbf63 commit a2779d9

30 files changed

+585
-32
lines changed
3.79 KB
Loading
2.72 KB
Loading
2.58 KB
Loading
2.97 KB
Loading
4.51 KB
Loading
3 KB
Loading
2.69 KB
Loading

harmony_changelog.md

+3
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@
1313
#### UI/UX:
1414
* Improve refreshing of the display.
1515

16+
#### Onboarding
17+
* Shortcuts instruction
18+
1619
### Fixed
1720

1821
## [1.7.0 2022-11-14]

image/assets/lang/English.json

+11
Original file line numberDiff line numberDiff line change
@@ -639,6 +639,17 @@
639639
"app_bell_onboarding_info_deep_click_warning": "<text weight='light' size='38'>You've </text><text weight='regular' size='38'>deep pressed</text>",
640640
"app_bell_onboarding_info_deep_click_correction": "<text weight='light' size='38'>Be more gentle,<br></br>try </text><text weight='regular' size='38'>light click </text><text weight='light' size='38'>this time</text>",
641641
"app_bell_onboarding_welcome": "Welcome",
642+
"app_bell_onboarding_shortcuts_question": "Do you want to see Shortcuts instruction?",
643+
"app_bell_onboarding_shortcuts_start": "Start",
644+
"app_bell_onboarding_shortcuts_skip": "Skip",
645+
"app_bell_onboarding_shortcuts_step_rotate": "Rotate to select",
646+
"app_bell_onboarding_shortcuts_step_light_click": "Light click to accept and move forward",
647+
"app_bell_onboarding_shortcuts_step_deep_press": "Deep press to active or deactivate the alarm",
648+
"app_bell_onboarding_shortcuts_step_home": "Long press back (2s) to return to the home view",
649+
"app_bell_onboarding_shortcuts_step_battery": "Long press back (2s) on the home view to see status battery",
650+
"app_bell_onboarding_shortcuts_step_turn_off": "Press back for 10s to turn off the device",
651+
"app_bell_onboarding_shortcuts_step_restart": "Press both side buttons for 10s to restart the device",
652+
"app_bell_onboarding_shortcuts_step_bedside_lamp": "Long press frontlight (2s) to turn on a bedside lamp",
642653
"app_bell_settings_advanced": "Advanced",
643654
"app_bell_settings_time_units": "Time",
644655
"app_bell_settings_temp_scale": "Temperature scale",

module-apps/apps-common/widgets/BellBaseLayout.hpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ namespace style::bell_base_layout
1111
constexpr inline auto w = style::window_width;
1212
constexpr inline auto h = style::window_height;
1313
constexpr inline auto first_layout_min_h = 30U;
14-
constexpr inline auto outer_layouts_w = 390U;
15-
constexpr inline auto outer_layouts_h = 100U;
16-
constexpr inline auto outer_layout_margin = 40U;
14+
constexpr inline auto outer_layouts_w = 448U;
15+
constexpr inline auto outer_layouts_h = 102U;
16+
constexpr inline auto outer_layout_margin = 38U;
1717
constexpr inline auto center_layout_w = 504U;
1818
constexpr inline auto center_layout_h = h - 2 * outer_layout_margin - 2 * outer_layouts_h;
1919

products/BellHybrid/CMakeLists.txt

+2-2
Original file line numberDiff line numberDiff line change
@@ -115,14 +115,14 @@ download_asset_release_json(json-common-target
115115
${CMAKE_CURRENT_SOURCE_DIR}/assets/assets_common.json
116116
${CMAKE_BINARY_DIR}/sysroot/sys/current/
117117
MuditaOSPublicAssets
118-
0.0.12
118+
0.0.13
119119
${MUDITA_CACHE_DIR}
120120
)
121121
download_asset_release_json(json-community-target
122122
${CMAKE_CURRENT_SOURCE_DIR}/assets/assets_community.json
123123
${CMAKE_BINARY_DIR}/sysroot/sys/current/
124124
MuditaOSPublicAssets
125-
0.0.12
125+
0.0.13
126126
${MUDITA_CACHE_DIR}
127127
)
128128
download_asset_json(json-rt1051-target

products/BellHybrid/apps/application-bell-onboarding/ApplicationBellOnBoarding.cpp

+34-19
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,15 @@
44
#include "ApplicationBellOnBoarding.hpp"
55

66
#include <presenter/OnBoardingLanguageWindowPresenter.hpp>
7+
#include <presenter/OnBoardingShortcutsWindowPresenter.hpp>
78
#include <windows/OnBoardingLanguageWindow.hpp>
89
#include <windows/OnBoardingFinalizeWindow.hpp>
910
#include <windows/OnBoardingOnOffWindow.hpp>
1011
#include <windows/OnBoardingSettingsWindow.hpp>
1112
#include <windows/OnBoardingWelcomeWindow.hpp>
1213
#include <windows/OnBoardingInstructionPromptWindow.hpp>
14+
#include <windows/OnBoardingShortcutsOptionWindow.hpp>
15+
#include <windows/OnBoardingShortcutsWindow.hpp>
1316

1417
#include <service-appmgr/Constants.hpp>
1518
#include <service-appmgr/messages/GetCurrentDisplayLanguageResponse.hpp>
@@ -45,7 +48,7 @@ namespace app
4548

4649
connect(typeid(manager::GetCurrentDisplayLanguageResponse), [&](sys::Message *msg) {
4750
if (gui::window::name::onBoardingLanguageWindow == getCurrentWindow()->getName()) {
48-
switchWindow(gui::window::name::onBoardingSettingsWindow);
51+
switchWindow(gui::window::name::onBoardingShortcutsOptionWindow);
4952
return sys::msgHandled();
5053
}
5154
return sys::msgNotHandled();
@@ -74,6 +77,17 @@ namespace app
7477
return std::make_unique<gui::OnBoardingLanguageWindow>(app, std::move(presenter), name);
7578
});
7679

80+
windowsFactory.attach(gui::window::name::onBoardingShortcutsOptionWindow,
81+
[this](ApplicationCommon *app, const std::string &name) {
82+
return std::make_unique<gui::OnBoardingShortcutsOptionWindow>(app, name);
83+
});
84+
85+
windowsFactory.attach(
86+
gui::window::name::onBoardingShortcutsWindow, [this](ApplicationCommon *app, const std::string &name) {
87+
auto presenter = std::make_unique<OnBoarding::OnBoardingShortcutsWindowPresenter>(this);
88+
return std::make_unique<gui::OnBoardingShortcutsWindow>(app, std::move(presenter), name);
89+
});
90+
7791
windowsFactory.attach(
7892
gui::window::name::onBoardingSettingsWindow, [this](ApplicationCommon *app, const std::string &name) {
7993
auto layoutModel = std::make_unique<bell_settings::LayoutModel>(this);
@@ -234,24 +248,26 @@ namespace app
234248
if (inputEvent.isKeyRelease(gui::KeyCode::KEY_UP) || inputEvent.isKeyRelease(gui::KeyCode::KEY_DOWN)) {
235249
informationState = OnBoarding::InformationStates::LightClickInfo;
236250
}
237-
else if (inputEvent.isKeyRelease(gui::KeyCode::KEY_RIGHT) ||
238-
inputEvent.isKeyRelease(gui::KeyCode::KEY_LEFT)) {
239-
informationState = OnBoarding::InformationStates::DeepClickWarningInfo;
240-
if (getCurrentWindow()->getName() == gui::window::name::informationOnBoardingWindow) {
241-
displayInformation(*getPreviousWindow());
242-
}
243-
else {
244-
displayInformation(getCurrentWindow()->getName());
245-
}
246-
}
247-
else if (inputEvent.isKeyRelease(gui::KeyCode::KEY_ENTER)) {
248-
if (informationState == OnBoarding::InformationStates::DeepClickWarningInfo) {
249-
informationPromptTimer.stop();
250-
informationState = OnBoarding::InformationStates::DeepClickCorrectionInfo;
251-
displayInformation(*getPreviousWindow());
251+
else if (getCurrentWindow()->getName() != gui::window::name::onBoardingShortcutsWindow) {
252+
if (inputEvent.isKeyRelease(gui::KeyCode::KEY_RIGHT) ||
253+
inputEvent.isKeyRelease(gui::KeyCode::KEY_LEFT)) {
254+
informationState = OnBoarding::InformationStates::DeepClickWarningInfo;
255+
if (getCurrentWindow()->getName() == gui::window::name::informationOnBoardingWindow) {
256+
displayInformation(*getPreviousWindow());
257+
}
258+
else {
259+
displayInformation(getCurrentWindow()->getName());
260+
}
252261
}
253-
else {
254-
informationState = OnBoarding::InformationStates::RotateInfo;
262+
else if (inputEvent.isKeyRelease(gui::KeyCode::KEY_ENTER)) {
263+
if (informationState == OnBoarding::InformationStates::DeepClickWarningInfo) {
264+
informationPromptTimer.stop();
265+
informationState = OnBoarding::InformationStates::DeepClickCorrectionInfo;
266+
displayInformation(*getPreviousWindow());
267+
}
268+
else {
269+
informationState = OnBoarding::InformationStates::RotateInfo;
270+
}
255271
}
256272
}
257273
}
@@ -283,7 +299,6 @@ namespace app
283299
}
284300
}
285301
}
286-
287302
return false;
288303
}
289304

products/BellHybrid/apps/application-bell-onboarding/CMakeLists.txt

+12
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,27 @@ target_sources(application-bell-onboarding
1919
windows/OnBoardingOnOffWindow.cpp
2020
windows/OnBoardingInstructionPromptWindow.cpp
2121
windows/OnBoardingWelcomeWindow.cpp
22+
windows/OnBoardingShortcutsOptionWindow.cpp
23+
windows/OnBoardingShortcutsWindow.cpp
2224
presenter/OnBoardingLanguageWindowPresenter.cpp
2325
presenter/OnBoardingFinalizeWindowPresenter.cpp
26+
presenter/OnBoardingShortcutsWindowPresenter.cpp
27+
layouts/OnBoardingShortcutsLayouts.cpp
28+
layouts/OnBoardingShortcutsLayoutClassic.cpp
2429

2530
presenter/OnBoardingLanguageWindowPresenter.hpp
2631
presenter/OnBoardingFinalizeWindowPresenter.hpp
32+
presenter/OnBoardingShortcutsWindowPresenter.hpp
2733
windows/OnBoardingLanguageWindow.hpp
2834
windows/OnBoardingOnOffWindow.hpp
2935
windows/OnBoardingSettingsWindow.hpp
3036
windows/OnBoardingInstructionPromptWindow.hpp
3137
windows/OnBoardingWelcomeWindow.hpp
38+
windows/OnBoardingShortcutsOptionWindow.hpp
39+
windows/OnBoardingShortcutsWindow.hpp
40+
layouts/OnBoardingShortcutsLayouts.hpp
41+
layouts/OnBoardingShortcutsLayoutProvider.hpp
42+
layouts/OnBoardingShortcutsLayoutClassic.hpp
3243

3344
PUBLIC
3445
include/application-bell-onboarding/ApplicationBellOnBoarding.hpp
@@ -38,6 +49,7 @@ target_link_libraries(application-bell-onboarding
3849
PRIVATE
3950
app
4051
apps-common
52+
bell::keymap
4153
bell::app-settings
4254

4355
PUBLIC

products/BellHybrid/apps/application-bell-onboarding/include/application-bell-onboarding/BellOnBoardingNames.hpp

+7-5
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,12 @@ namespace app
1010

1111
namespace gui::window::name
1212
{
13-
inline constexpr auto onBoardingOnOffWindow = "BellOnBoardingOnOff";
14-
inline constexpr auto onBoardingLanguageWindow = "BellOnBoardingLanguage";
15-
inline constexpr auto onBoardingSettingsWindow = "BellOnBoardingSettings";
16-
inline constexpr auto finalizeOnBoardingWindow = "BellOnBoardingFinalize";
17-
inline constexpr auto informationOnBoardingWindow = "BellOnBoardingInformation";
13+
inline constexpr auto onBoardingOnOffWindow = "BellOnBoardingOnOff";
14+
inline constexpr auto onBoardingLanguageWindow = "BellOnBoardingLanguage";
15+
inline constexpr auto onBoardingShortcutsOptionWindow = "BellOnBoardingShortcutsOption";
16+
inline constexpr auto onBoardingShortcutsWindow = "BellOnBoardingShortcuts";
17+
inline constexpr auto onBoardingSettingsWindow = "BellOnBoardingSettings";
18+
inline constexpr auto finalizeOnBoardingWindow = "BellOnBoardingFinalize";
19+
inline constexpr auto informationOnBoardingWindow = "BellOnBoardingInformation";
1820

1921
} // namespace gui::window::name
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
// Copyright (c) 2017-2022, Mudita Sp. z.o.o. All rights reserved.
2+
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md
3+
4+
#include "OnBoardingShortcutsLayoutClassic.hpp"
5+
#include <apps-common/widgets/BellBaseLayout.hpp>
6+
#include <i18n/i18n.hpp>
7+
#include <Style.hpp>
8+
#include <ImageBox.hpp>
9+
#include <TextFixedSize.hpp>
10+
11+
namespace
12+
{
13+
namespace container
14+
{
15+
constexpr inline auto width = 544U;
16+
constexpr inline auto height = 220U;
17+
constexpr inline auto top_margin = 74U;
18+
19+
namespace separator
20+
{
21+
constexpr inline auto height = 22U;
22+
} // namespace separator
23+
24+
namespace image
25+
{
26+
constexpr inline auto height = container::height - separator::height;
27+
constexpr inline auto width = 448U;
28+
} // namespace image
29+
30+
namespace text
31+
{
32+
constexpr inline auto height = 146U;
33+
constexpr inline auto width = 448U;
34+
} // namespace text
35+
36+
} // namespace container
37+
} // namespace
38+
39+
namespace gui
40+
{
41+
OnBoardingShortcutsLayoutClassic::OnBoardingShortcutsLayoutClassic(const UTF8 &image,
42+
const UTF8 &description,
43+
bool leftArrowVisible,
44+
bool rightArrowVisible)
45+
: OnBoardingShortcutsLayoutProvider(image, description),
46+
VBox(nullptr, 0, 0, style::bell_base_layout::w, style::bell_base_layout::h), image{image},
47+
description{description}, leftArrowVisible{leftArrowVisible}, rightArrowVisible{rightArrowVisible}
48+
{
49+
buildInterface();
50+
}
51+
52+
void OnBoardingShortcutsLayoutClassic::buildInterface()
53+
{
54+
setAlignment(Alignment::Horizontal::Center);
55+
56+
auto containerThreeBox = new HThreeBox<HBox, HBox, HBox>(this);
57+
containerThreeBox->setMinimumSize(container::width, container::image::height);
58+
containerThreeBox->setAlignment(Alignment(Alignment::Horizontal::Center, Alignment::Vertical::Bottom));
59+
containerThreeBox->setMargins(Margins(0, container::top_margin, 0, 0));
60+
containerThreeBox->setEdges(RectangleEdge::None);
61+
62+
containerThreeBox->firstBox = new HBox(containerThreeBox);
63+
containerThreeBox->firstBox->setAlignment(Alignment(Alignment::Vertical::Top));
64+
containerThreeBox->firstBox->setEdges(RectangleEdge::None);
65+
containerThreeBox->firstBox->activeItem = false;
66+
67+
auto leftArrowBox = new ImageBox(containerThreeBox->firstBox, new Image("bell_arrow_left_W_M"));
68+
leftArrowBox->setAlignment(Alignment(Alignment::Horizontal::Left, Alignment::Vertical::Bottom));
69+
leftArrowBox->setMinimumSizeToFitImage();
70+
leftArrowBox->setVisible(leftArrowVisible);
71+
leftArrowBox->setEdges(RectangleEdge::None);
72+
containerThreeBox->firstBox->setMinimumSize(leftArrowBox->widgetMinimumArea.w,
73+
leftArrowBox->widgetMinimumArea.h);
74+
75+
containerThreeBox->centerBox = new HBox(containerThreeBox);
76+
containerThreeBox->centerBox->setEdges(RectangleEdge::None);
77+
containerThreeBox->centerBox->setAlignment(
78+
Alignment(Alignment::Horizontal::Center, Alignment::Vertical::Bottom));
79+
containerThreeBox->centerBox->setMaximumSize(container::image::width, container::image::height);
80+
81+
auto imageBox = new ImageBox(containerThreeBox->centerBox, new Image(image, ImageTypeSpecifier::W_G));
82+
imageBox->setAlignment(Alignment(Alignment::Horizontal::Center, Alignment::Vertical::Bottom));
83+
imageBox->setMinimumSizeToFitImage();
84+
imageBox->setVisible(true);
85+
86+
containerThreeBox->lastBox = new HBox(containerThreeBox);
87+
containerThreeBox->lastBox->setAlignment(Alignment(Alignment::Vertical::Bottom));
88+
containerThreeBox->lastBox->setEdges(RectangleEdge::None);
89+
containerThreeBox->lastBox->activeItem = false;
90+
91+
auto rightArrowBox = new ImageBox(containerThreeBox->lastBox, new Image("bell_arrow_right_W_M"));
92+
rightArrowBox->setAlignment(Alignment(Alignment::Horizontal::Left, Alignment::Vertical::Bottom));
93+
rightArrowBox->setMinimumSizeToFitImage();
94+
rightArrowBox->setVisible(rightArrowVisible);
95+
rightArrowBox->setEdges(RectangleEdge::None);
96+
containerThreeBox->lastBox->setMinimumSize(rightArrowBox->widgetMinimumArea.w,
97+
rightArrowBox->widgetMinimumArea.h);
98+
99+
auto containerSeparator = new VBox(this, 0, 0, container::width, container::separator::height);
100+
containerSeparator->setAlignment(Alignment(gui::Alignment::Horizontal::Center));
101+
containerSeparator->setEdges(RectangleEdge::None);
102+
containerSeparator->activeItem = false;
103+
104+
auto containerText = new VBox(this, 0, 0, container::text::width, container::text::height);
105+
containerText->setAlignment(Alignment(gui::Alignment::Horizontal::Center));
106+
containerText->setEdges(RectangleEdge::None);
107+
containerText->activeItem = false;
108+
109+
auto textBox = new Text(containerText, 0, 0, 0, 0);
110+
textBox->setMinimumSize(container::text::width, container::text::height);
111+
textBox->setAlignment(Alignment::Horizontal::Center);
112+
textBox->setTextType(TextType::MultiLine);
113+
textBox->setEditMode(EditMode::Browse);
114+
textBox->setFont(style::window::font::verybiglight);
115+
textBox->setRichText(utils::translate(description));
116+
117+
this->resizeItems();
118+
}
119+
120+
auto OnBoardingShortcutsLayoutClassic::getLayout() -> Item *
121+
{
122+
return this;
123+
}
124+
}; // namespace gui
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
// Copyright (c) 2017-2022, Mudita Sp. z.o.o. All rights reserved.
2+
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md
3+
4+
#pragma once
5+
6+
#include "OnBoardingShortcutsLayoutProvider.hpp"
7+
8+
#include <BoxLayout.hpp>
9+
10+
namespace gui
11+
{
12+
class BellBaseLayout;
13+
14+
class OnBoardingShortcutsLayoutClassic : public OnBoardingShortcutsLayoutProvider, VBox
15+
{
16+
private:
17+
const UTF8 image;
18+
const UTF8 description;
19+
20+
const bool leftArrowVisible;
21+
const bool rightArrowVisible;
22+
23+
void buildInterface();
24+
25+
public:
26+
OnBoardingShortcutsLayoutClassic(const UTF8 &image,
27+
const UTF8 &description,
28+
bool leftArrowVisible = true,
29+
bool rightArrowVisible = true);
30+
31+
auto getLayout() -> Item * override;
32+
};
33+
}; // namespace gui
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
// Copyright (c) 2017-2022, Mudita Sp. z.o.o. All rights reserved.
2+
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md
3+
4+
#pragma once
5+
6+
#include <utf8/UTF8.hpp>
7+
8+
namespace gui
9+
{
10+
class Item;
11+
12+
class OnBoardingShortcutsLayoutProvider
13+
{
14+
private:
15+
const UTF8 image;
16+
const UTF8 description;
17+
const bool leftArrow;
18+
const bool rightArrow;
19+
20+
public:
21+
OnBoardingShortcutsLayoutProvider(const UTF8 &image,
22+
const UTF8 &description,
23+
bool leftArrow = true,
24+
bool rightArrow = true)
25+
: image{image}, description{description}, leftArrow{leftArrow}, rightArrow{rightArrow} {};
26+
virtual ~OnBoardingShortcutsLayoutProvider() noexcept = default;
27+
28+
virtual Item *getLayout() = 0;
29+
};
30+
}; // namespace gui

0 commit comments

Comments
 (0)