diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 40e180a7e..3b1607fe5 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -20,12 +20,6 @@ jobs: fetch-depth: 0 - name: check commit messages run: ./tools/check_commit_messages.py - build: - if: github.event.pull_request.draft == false - runs-on: self-hosted - steps: - - name: build - run: echo "Placeholder for old CI scripts" check_copyright_and_style: name: check copyright and style if: github.event.pull_request.draft == false diff --git a/.github/workflows/releases.yaml b/.github/workflows/releases.yaml index 4d6b7af38..bf6824143 100644 --- a/.github/workflows/releases.yaml +++ b/.github/workflows/releases.yaml @@ -27,13 +27,17 @@ jobs: popd - name: "Build and package for RT1051" id: build_release_package + env: + ASSETS_LOGIN: ${{ secrets.ASSETS_LOGIN }} + ASSETS_TOKEN: ${{ secrets.ASSETS_TOKEN }} run: | ./configure.sh rt1051 RelWithDebInfo && \ pushd build-rt1051-RelWithDebInfo && \ export JOBS=${JOBS:-`nproc`} && \ echo "JOBS=${JOBS}" && \ make -j ${JOBS} && \ - make -j ${JOBS} package && \ + make package-update VERBOSE=1 && \ + make package-standalone && \ popd && \ ./print_last_changes.sh && \ uptime @@ -48,15 +52,26 @@ jobs: draft: true prerelease: true body: ${{steps.build_release_package.outputs.release_notes }} - - name: Upload Release Package - id: upload-release-package + - name: Upload Standalone Package + id: upload-stanalone-package uses: actions/upload-release-asset@v1.0.2 env: GITHUB_TOKEN: ${{ secrets.GitHub_PAT }} with: upload_url: ${{ steps.create_release.outputs.upload_url }} # here we have to use relative path with starting "./" - asset_path: ./${{ steps.build_release_package.outputs.package_path }}/${{steps.build_release_package.outputs.package}} - asset_name: ${{ steps.build_release_package.outputs.package }} - asset_content_type: ${{ steps.build_release_package.outputs.mime_type }} + asset_path: ./${{ steps.build_release_package.outputs.package_path }}/${{ steps.build_release_package.outputs.package-standalone }} + asset_name: ${{ steps.build_release_package.outputs.package-standalone }} + asset_content_type: ${{ steps.build_release_package.outputs.standalone-mime_type }} + - name: Upload Update Package + id: upload-update-package + uses: actions/upload-release-asset@v1.0.2 + env: + GITHUB_TOKEN: ${{ secrets.GitHub_PAT }} + with: + upload_url: ${{ steps.create_release.outputs.upload_url }} + # here we have to use relative path with starting "./" + asset_path: ./${{ steps.build_release_package.outputs.package_path }}/${{ steps.build_release_package.outputs.package-update }} + asset_name: ${{ steps.build_release_package.outputs.package-update }} + asset_content_type: ${{ steps.build_release_package.outputs.update-mime_type }} diff --git a/CMakeLists.txt b/CMakeLists.txt index 18427412c..527d60613 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -269,24 +269,48 @@ if (${PROJECT_TARGET} STREQUAL "TARGET_RT1051") ) # download the bootloader - add_custom_target(ecoboot.bin - COMMAND ${CMAKE_SOURCE_DIR}/tools/download_asset.py - -w ${CMAKE_BINARY_DIR}/update ecoboot download - > ${CMAKE_BINARY_DIR}/update/download_info.txt - BYPRODUCTS update/ecoboot.bin - COMMENT "Downloading ecoboot.bin" - ) + set(ECOBOOT_FILE ${CMAKE_BINARY_DIR}/ecoboot.bin) + set(ECOBOOT_DOWNLOAD_LOG ${CMAKE_BINARY_DIR}/download_info.txt) + + if(DEFINED ENV{ASSETS_LOGIN} AND DEFINED ENV{ASSETS_TOKEN}) + message("ecooboot download with tokens") + add_custom_command(OUTPUT ${ECOBOOT_FILE} + COMMAND ${CMAKE_SOURCE_DIR}/tools/download_asset.py + -l $ENV{ASSETS_LOGIN} + -t $ENV{ASSETS_TOKEN} + -w ${CMAKE_BINARY_DIR} ecoboot download + > ${ECOBOOT_DOWNLOAD_LOG} + COMMENT "Downloading ecoboot.bin" + BYPRODUCTS ${ECOBOOT_FILE} ${ECOBOOT_DOWNLOAD_LOG} + ) + else() + message("ecoboot download with git") + add_custom_command(OUTPUT ${ECOBOOT_FILE} + COMMAND ${CMAKE_SOURCE_DIR}/tools/download_asset.py + -w ${CMAKE_BINARY_DIR} ecoboot download + > ${ECOBOOT_DOWNLOAD_LOG} + COMMENT "Downloading ecoboot.bin" + BYPRODUCTS ${ECOBOOT_FILE} ${ECOBOOT_DOWNLOAD_LOG} + ) + endif() + + add_custom_target(ecoboot.bin DEPENDS ${ECOBOOT_FILE}) + # generate version.json file (runs CMake script at build time) - add_custom_target( - version.json + set(VERSION_JSON ${CMAKE_BINARY_DIR}/version.json) + add_custom_command(OUTPUT ${VERSION_JSON} COMMAND ${CMAKE_COMMAND} -DSRC_DIR=${CMAKE_SOURCE_DIR} + -DECOBOOT_DOWNLOAD_LOG=${ECOBOOT_DOWNLOAD_LOG} -B ${CMAKE_BINARY_DIR} -P ${CMAKE_SOURCE_DIR}/config/GenUpdateVersionJson.cmake - DEPENDS ecoboot.bin + DEPENDS ecoboot.bin ${ECOBOOT_DOWNLOAD_LOG} + BYPRODUCTS ${VERSION_JSON} ) - install(FILES ${CMAKE_BINARY_DIR}/update/ecoboot.bin DESTINATION "./" COMPONENT Update) - install(FILES ${CMAKE_BINARY_DIR}/update/version.json DESTINATION "./" COMPONENT Update) + add_custom_target(version.json DEPENDS ${VERSION_JSON}) + + multicomp_install(PROGRAMS ${ECOBOOT_FILE} DESTINATION "./" COMPONENTS Standalone Update) + multicomp_install(FILES ${VERSION_JSON} DESTINATION "./" COMPONENTS Standalone Update) set(CPACK_SYSTEM_NAME "RT1051") # allow both standalone and update packages in RT1051 config @@ -403,19 +427,23 @@ if (${PROJECT_TARGET} STREQUAL "TARGET_RT1051") add_custom_target(package-standalone COMMAND zip -rq ${CMAKE_BINARY_DIR}/${PACKAGE_STANDALONE_FILE_NAME} "." WORKING_DIRECTORY ${PACKAGE_STAGING_DIRECTORY}/Standalone - DEPENDS package-standalone-staged + DEPENDS ${ECOBOOT_FILE} package-standalone-staged PurePhone ) + set(UPDATE_STAGING_DIRECTORY ${PACKAGE_STAGING_DIRECTORY}/Update) add_custom_target(package-update-checksums COMMAND rhash - -u ${PACKAGE_STAGING_DIRECTORY}/Update/checksums.txt - -r ${PACKAGE_STAGING_DIRECTORY}/Update + -u checksums.txt + -r . + WORKING_DIRECTORY ${UPDATE_STAGING_DIRECTORY} DEPENDS package-update-staged ) + set(PACKAGE_UPDATE_FILE_NAME ${PACKAGE_COMMON_NAME}-Update.tar) + set(PACKAGE_UPDATE_MIME "application/x-tar") add_custom_target(package-update COMMAND tar - -czf ${CMAKE_BINARY_DIR}/${PACKAGE_COMMON_NAME}-Update.tar.gz + -cf ${CMAKE_BINARY_DIR}/${PACKAGE_UPDATE_FILE_NAME} -C ${PACKAGE_STAGING_DIRECTORY}/Update "." - DEPENDS package-update-staged package-update-checksums + DEPENDS ecoboot.bin version.json PurePhone package-update-staged package-update-checksums ) elseif (${PROJECT_TARGET} STREQUAL "TARGET_Linux") set(PACKAGE_STANDALONE_FILE_NAME ${PACKAGE_COMMON_NAME}-Standalone.tar.gz) @@ -429,9 +457,14 @@ elseif (${PROJECT_TARGET} STREQUAL "TARGET_Linux") endif() if (NOT "$ENV{GITHUB_WORKSPACE}" STREQUAL "") - message("set-output name=package::${PACKAGE_STANDALONE_FILE_NAME}") - message("::set-output name=package::${PACKAGE_STANDALONE_FILE_NAME}") - - message("set-output name=mime_type::${PACKAGE_STANDALONE_MIME}") - message("::set-output name=mime_type::${PACKAGE_STANDALONE_MIME}") + message("set-output name=package-standalone::${PACKAGE_STANDALONE_FILE_NAME}") + message("::set-output name=package-standalone::${PACKAGE_STANDALONE_FILE_NAME}") + message("set-output name=standalone-mime_type::${PACKAGE_STANDALONE_MIME}") + message("::set-output name=standalone-mime_type::${PACKAGE_STANDALONE_MIME}") + + message("set-output name=package-update::${PACKAGE_UPDATE_FILE_NAME}") + message("::set-output name=package-update::${PACKAGE_UPDATE_FILE_NAME}") + message("set-output name=update-mime_type::${PACKAGE_UPDATE_MIME}") + message("::set-output name=update-mime_type::${PACKAGE_UPDATE_MIME}") + endif() diff --git a/art/phone/application_desktop/menu/dead_battery_W_G.png b/art/phone/application_desktop/menu/dead_battery_W_G.png new file mode 100644 index 000000000..65b9f0b42 Binary files /dev/null and b/art/phone/application_desktop/menu/dead_battery_W_G.png differ diff --git a/changelog.md b/changelog.md index 3aaaf6731..726408062 100644 --- a/changelog.md +++ b/changelog.md @@ -5,7 +5,9 @@ ### Added * Add hardware in the loop tests. -* Add empty APN settings window. +* Add APN settings window. +* Add New/Edit APN window +* Add APN options window ### Changed diff --git a/config/GenUpdateVersionJson.cmake b/config/GenUpdateVersionJson.cmake index 2ad15995a..e6f3c5fa9 100644 --- a/config/GenUpdateVersionJson.cmake +++ b/config/GenUpdateVersionJson.cmake @@ -8,7 +8,7 @@ include(Version) set(BOOTLOADER_INCLUDED "true") set(BOOTLOADER_FILENAME "ecoboot.bin") execute_process( - COMMAND grep "release:" "${CMAKE_BINARY_DIR}/update/download_info.txt" + COMMAND grep "release:" "${ECOBOOT_DOWNLOAD_LOG}" COMMAND awk "{print $2}" OUTPUT_VARIABLE BOOTLOADER_VERSION OUTPUT_STRIP_TRAILING_WHITESPACE @@ -16,6 +16,6 @@ execute_process( configure_file( ${SRC_DIR}/config/version.json.cmake_template - ${CMAKE_BINARY_DIR}/update/version.json + ${CMAKE_BINARY_DIR}/version.json @ONLY ) diff --git a/doc/development_workflow.md b/doc/development_workflow.md index fd2ffc879..524ccc2e1 100644 --- a/doc/development_workflow.md +++ b/doc/development_workflow.md @@ -53,6 +53,7 @@ Before submitting a Pull Request please go through some basic checks: - test your changes on both Linux and RT1051 platforms (please pay special attention to the things you might break unintentionally, e.g. when working on calling, check call log too, - run unit tests (`make check`), +- [run static analysis](static_analysis.md) - check if your code formatting complies with [`.clang-format`](../clang-format), - whenever you add third-party software to MuditaOS source code, please make sure that the software component is added to a dedicated [section in `LICENSE.md` file on MuditaOS GitHub repository](../LICENSE.md) with a link to the text of the license where applicable. diff --git a/doc/static_analysis.md b/doc/static_analysis.md new file mode 100644 index 000000000..599fad304 --- /dev/null +++ b/doc/static_analysis.md @@ -0,0 +1,31 @@ +# Static code analysis + +The Static code analysis is a method of debugging that is done by examining the source code without executing the program. + +Before submitting the Pull Request a developer should run static code analyzer tool and make sure that his code complies with the Coding Standards. + +## Clang-tidy + +The clang-tidy is a clang-based C++ “linter” tool. Its purpose is to provide an extensible framework for diagnosing and fixing typical programming errors, like style violations, interface misuse, or bugs that can be deduced via static analysis. + +### Install clang-tidy + +#### Linux Ubuntu + +The clang-tidy tool is available from the APT repository. + +`$ sudo apt install clang-tidy` + +### Run clang-tidy + +If `run-clang-tidy` program is installed, a CMake target called `clang-tidy` is available. + +In order to run `clang-tidy` analyzer on the MuditaOS repository, follow the steps: +``` +$ cd +$ ./configure.sh +$ cd +$ make clang-tidy +``` + +The results of the analysis are available under `$(pwd)/StaticAnalysis` directory. diff --git a/image/assets/images/dead_battery_W_G.vpi b/image/assets/images/dead_battery_W_G.vpi new file mode 100644 index 000000000..da057fb3d Binary files /dev/null and b/image/assets/images/dead_battery_W_G.vpi differ diff --git a/image/assets/lang/English.json b/image/assets/lang/English.json index 53a54c7a3..6a0a9066a 100644 --- a/image/assets/lang/English.json +++ b/image/assets/lang/English.json @@ -352,7 +352,6 @@ "app_settings_network_sim_none": "No Sim", "app_settings_network_voice_over_lte" : "VoLTE (experimental)", "app_settings_network_apn_settings" : "APN settings", - "app_settings_network_apn_settings_no_apns" : "No APNs yet.

Press left arrow to add new.

", "app_settings_toggle_on": "ON", "app_settings_toggle_off": "OFF", "app_settings_security_lock_screen_passcode": "Lock screen passcode", @@ -363,6 +362,19 @@ "app_settings_security_wrong_passcode": "Wrong passcode!", "app_settings_security_passcode_changed_successfully": "Passcode changed successfully!", "app_settings_security_passcode_disabled": "Passcode disabled!", + "app_settings_apn_settings_no_apns" : "No APNs yet.

Press left arrow to add new.

", + "app_settings_apn_options" : "Options", + "app_settings_apn_options_delete" : "Delete", + "app_settings_apn_options_edit" : "Edit", + "app_settings_apn_options_set_as_default" : "Set as default", + "app_settings_new_edit_apn": "New/Edit APN", + "app_settings_apn_name": "Name", + "app_settings_apn_APN": "APN", + "app_settings_apn_username": "UserName", + "app_settings_apn_password": "Password", + "app_settings_apn_authtype": "Authentication type", + "app_settings_apn_apntype": "APN Type", + "app_settings_apn_apnprotocol" : "APN Protocol", "app_phonebook_title_main": "Contacts", "app_phonebook_search_win_contacts": "Contacts", "common_search_uc": "Search", diff --git a/module-apps/Application.cpp b/module-apps/Application.cpp index 091fd9ef5..6833d9885 100644 --- a/module-apps/Application.cpp +++ b/module-apps/Application.cpp @@ -70,10 +70,12 @@ namespace app uint32_t stackDepth, sys::ServicePriority priority) : Service(std::move(name), std::move(parent), stackDepth, priority), - default_window(gui::name::window::main_window), windowsStack(this), startInBackground{startInBackground}, - callbackStorage{std::make_unique()}, settings(std::make_unique(this)) + default_window(gui::name::window::main_window), windowsStack(this), + keyTranslator{std::make_unique()}, startInBackground{startInBackground}, + callbackStorage{std::make_unique()}, topBarManager{std::make_unique()}, + settings(std::make_unique(this)) { - keyTranslator = std::make_unique(); + topBarManager->enableIndicators({gui::top_bar::Indicator::Time}); busChannels.push_back(sys::BusChannels::ServiceCellularNotifications); longPressTimer = std::make_unique("LongPress", this, key_timer_ms); @@ -82,13 +84,16 @@ namespace app connect(typeid(AppRefreshMessage), [this](sys::Message *msg) -> sys::MessagePointer { return handleAppRefresh(msg); }); - settings->registerValueChange(settings::SystemProperties::timeFormat12, - [this](std::string value) { timeFormatChanged(value); }); + settings->registerValueChange( + settings::SystemProperties::timeFormat12, + [this](std::string value) { timeFormatChanged(value); }, + settings::SettingsScope::Global); } Application::~Application() noexcept { windowsStack.windows.clear(); + settings->unregisterValueChange(); } Application::State Application::getState() @@ -496,7 +501,8 @@ namespace app settings->registerValueChange( settings::SystemProperties::lockScreenPasscodeIsOn, - [this](const std::string &value) { setLockScreenPasscodeOn(utils::getNumericValue(value)); }); + [this](const std::string &value) { setLockScreenPasscodeOn(utils::getNumericValue(value)); }, + settings::SettingsScope::Global); return sys::ReturnCodes::Success; } @@ -693,6 +699,11 @@ namespace app item->attachTimer(std::move(timer)); } + const gui::top_bar::Configuration &Application::getTopBarConfiguration() const noexcept + { + return topBarManager->getConfiguration(); + } + void Application::addActionReceiver(manager::actions::ActionId actionId, OnActionReceived &&callback) { receivers.insert_or_assign(actionId, std::move(callback)); diff --git a/module-apps/Application.hpp b/module-apps/Application.hpp index 875f0e867..c2cb2d4e1 100644 --- a/module-apps/Application.hpp +++ b/module-apps/Application.hpp @@ -25,6 +25,7 @@ #include // for string #include // for move, pair #include // for vector +#include "TopBarManager.hpp" #include "WindowsFactory.hpp" #include "WindowsStack.hpp" @@ -369,6 +370,8 @@ namespace app void addActionReceiver(manager::actions::ActionId actionId, OnActionReceived &&callback); + std::unique_ptr topBarManager; + /// application's settings std::unique_ptr settings; virtual void timeFormatChanged(std::string value); @@ -378,6 +381,7 @@ namespace app bool isTimeFormat12() const noexcept; void setLockScreenPasscodeOn(bool screenPasscodeOn) noexcept; bool isLockScreenPasscodeOn() const noexcept; + const gui::top_bar::Configuration &getTopBarConfiguration() const noexcept; }; /// Parameter pack used by application launch action. diff --git a/module-apps/CMakeLists.txt b/module-apps/CMakeLists.txt index ea6699576..1c885c8aa 100644 --- a/module-apps/CMakeLists.txt +++ b/module-apps/CMakeLists.txt @@ -15,6 +15,7 @@ set( SOURCES "Application.cpp" "GuiTimer.cpp" "WindowsFactory.cpp" + "TopBarManager.cpp" "AsyncTask.cpp" "CallbackStorage.cpp" "windows/AppWindow.cpp" diff --git a/module-apps/TopBarManager.cpp b/module-apps/TopBarManager.cpp new file mode 100644 index 000000000..91ab882a8 --- /dev/null +++ b/module-apps/TopBarManager.cpp @@ -0,0 +1,17 @@ +// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. +// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md + +#include "TopBarManager.hpp" + +namespace app +{ + void TopBarManager::enableIndicators(const gui::top_bar::Indicators &indicators) + { + topBarConfiguration.enable(indicators); + } + + auto TopBarManager::getConfiguration() const noexcept -> const gui::top_bar::Configuration & + { + return topBarConfiguration; + } +} // namespace app diff --git a/module-apps/TopBarManager.hpp b/module-apps/TopBarManager.hpp new file mode 100644 index 000000000..287ca4ef1 --- /dev/null +++ b/module-apps/TopBarManager.hpp @@ -0,0 +1,19 @@ +// 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 + +namespace app +{ + class TopBarManager + { + public: + void enableIndicators(const gui::top_bar::Indicators &indicators); + [[nodiscard]] auto getConfiguration() const noexcept -> const gui::top_bar::Configuration &; + + private: + gui::top_bar::Configuration topBarConfiguration; + }; +} // namespace app diff --git a/module-apps/application-alarm-clock/windows/AlarmClockMainWindow.cpp b/module-apps/application-alarm-clock/windows/AlarmClockMainWindow.cpp index e67e2b1c1..403a45196 100644 --- a/module-apps/application-alarm-clock/windows/AlarmClockMainWindow.cpp +++ b/module-apps/application-alarm-clock/windows/AlarmClockMainWindow.cpp @@ -32,7 +32,6 @@ namespace app::alarmClock { AppWindow::buildInterface(); - topBar->setActive(gui::TopBar::Elements::TIME, true); bottomBar->setActive(gui::BottomBar::Side::RIGHT, true); bottomBar->setText(gui::BottomBar::Side::RIGHT, utils::localize.get(style::strings::common::back)); bottomBar->setText(gui::BottomBar::Side::CENTER, utils::localize.get(style::strings::common::Switch)); diff --git a/module-apps/application-alarm-clock/windows/CustomRepeatWindow.cpp b/module-apps/application-alarm-clock/windows/CustomRepeatWindow.cpp index ad38d2551..3c3d04413 100644 --- a/module-apps/application-alarm-clock/windows/CustomRepeatWindow.cpp +++ b/module-apps/application-alarm-clock/windows/CustomRepeatWindow.cpp @@ -18,9 +18,6 @@ namespace app::alarmClock { AppWindow::buildInterface(); - topBar->setActive(gui::TopBar::Elements::TIME, true); - topBar->setActive(gui::TopBar::Elements::SIM, false); - topBar->setActive(gui::TopBar::Elements::NETWORK_ACCESS_TECHNOLOGY, false); bottomBar->setActive(gui::BottomBar::Side::RIGHT, true); bottomBar->setActive(gui::BottomBar::Side::CENTER, true); bottomBar->setText(gui::BottomBar::Side::RIGHT, utils::localize.get(style::strings::common::back)); diff --git a/module-apps/application-alarm-clock/windows/NewEditAlarmWindow.cpp b/module-apps/application-alarm-clock/windows/NewEditAlarmWindow.cpp index 10d50a8f1..9962ad9fe 100644 --- a/module-apps/application-alarm-clock/windows/NewEditAlarmWindow.cpp +++ b/module-apps/application-alarm-clock/windows/NewEditAlarmWindow.cpp @@ -21,7 +21,6 @@ namespace app::alarmClock { AppWindow::buildInterface(); - topBar->setActive(gui::TopBar::Elements::TIME, true); bottomBar->setActive(gui::BottomBar::Side::RIGHT, true); bottomBar->setActive(gui::BottomBar::Side::CENTER, true); bottomBar->setText(gui::BottomBar::Side::RIGHT, utils::localize.get(style::strings::common::back)); diff --git a/module-apps/application-antenna/windows/AlgoParamsWindow.cpp b/module-apps/application-antenna/windows/AlgoParamsWindow.cpp index c378e2b35..d23de0558 100644 --- a/module-apps/application-antenna/windows/AlgoParamsWindow.cpp +++ b/module-apps/application-antenna/windows/AlgoParamsWindow.cpp @@ -39,10 +39,6 @@ namespace gui bottomBar->setText(BottomBar::Side::CENTER, utils::localize.get(style::strings::common::open)); bottomBar->setText(BottomBar::Side::RIGHT, utils::localize.get(style::strings::common::back)); - topBar->setActive(TopBar::Elements::SIGNAL, true); - topBar->setActive(TopBar::Elements::TIME, true); - topBar->setActive(TopBar::Elements::BATTERY, true); - setTitle(utils::localize.get("app_desktop_tools_antenna")); lowBandBox = new gui::VBox(this, diff --git a/module-apps/application-antenna/windows/AntennaMainWindow.cpp b/module-apps/application-antenna/windows/AntennaMainWindow.cpp index 886bcc8e0..e3dc230e1 100644 --- a/module-apps/application-antenna/windows/AntennaMainWindow.cpp +++ b/module-apps/application-antenna/windows/AntennaMainWindow.cpp @@ -48,10 +48,6 @@ namespace gui bottomBar->setText(BottomBar::Side::CENTER, utils::localize.get(style::strings::common::open)); bottomBar->setText(BottomBar::Side::RIGHT, utils::localize.get(style::strings::common::back)); - topBar->setActive(TopBar::Elements::SIGNAL, true); - topBar->setActive(TopBar::Elements::TIME, true); - topBar->setActive(TopBar::Elements::BATTERY, true); - setTitle(utils::localize.get("app_desktop_tools_antenna")); for (auto title : titlesText) { diff --git a/module-apps/application-antenna/windows/ScanModesWindow.cpp b/module-apps/application-antenna/windows/ScanModesWindow.cpp index 1049be94b..f310038f6 100644 --- a/module-apps/application-antenna/windows/ScanModesWindow.cpp +++ b/module-apps/application-antenna/windows/ScanModesWindow.cpp @@ -37,10 +37,6 @@ namespace gui bottomBar->setText(BottomBar::Side::CENTER, utils::localize.get(style::strings::common::open)); bottomBar->setText(BottomBar::Side::RIGHT, utils::localize.get(style::strings::common::back)); - topBar->setActive(TopBar::Elements::SIGNAL, true); - topBar->setActive(TopBar::Elements::TIME, true); - topBar->setActive(TopBar::Elements::BATTERY, true); - setTitle(utils::localize.get("app_desktop_tools_antenna")); modeButtonParams.insert(std::pair(scanModes::Auto, "AUTO")); diff --git a/module-apps/application-calculator/data/CalculatorUtility.cpp b/module-apps/application-calculator/data/CalculatorUtility.cpp index 332cadc35..584788b58 100644 --- a/module-apps/application-calculator/data/CalculatorUtility.cpp +++ b/module-apps/application-calculator/data/CalculatorUtility.cpp @@ -15,6 +15,9 @@ Result Calculator::calculate(std::string source) double result = te_interp(source.c_str(), &error); if (error == 0 && !std::isinf(result) && !std::isnan(result)) { auto output = utils::to_string(result); + if (output.length() > CalculatorConstants::maxStringLength) { + output = getValueThatFitsOnScreen(result); + } if (utils::localize.get("app_calculator_decimal_separator") == style::calculator::symbols::strings::comma) { output.replace(output.find(style::calculator::symbols::strings::full_stop), std::size(std::string_view(style::calculator::symbols::strings::full_stop)), @@ -48,3 +51,70 @@ std::string Calculator::replaceAllOccurrences(std::string input, const std::stri } return input; } + +std::string Calculator::getValueThatFitsOnScreen(double result) +{ + auto base = static_cast(result); + auto length = utils::to_string(base).length(); + if (base < 0) { + length -= 1; + } + if (length > CalculatorConstants::expLength + 1) { + return convertToNumberWithPositiveExponent(result, length - 1); + } + else if (length == CalculatorConstants::expLength + 1) { + if (result < 0) { + return utils::to_string(getCoefficient(result, CalculatorConstants::veryLowPrecision)); + } + return utils::to_string(getCoefficient(result, CalculatorConstants::lowPrecision)); + } + else if (length == 1 && result < -1) { + return utils::to_string(getCoefficient(result, CalculatorConstants::lowPrecision)); + } + else if (result > 1) { + return utils::to_string(getCoefficient(result, CalculatorConstants::precision)); + } + else { + return convertToNumberWithNegativeExponent(result, base); + } +} + +std::string Calculator::convertToNumberWithPositiveExponent(double result, uint32_t exponent) +{ + result /= pow(10, exponent); + auto exponentLength = utils::to_string(exponent).length(); + auto decimalPlace = CalculatorConstants::precision - exponentLength - CalculatorConstants::expLength; + if (result < 0) { + decimalPlace -= 1; + } + return utils::to_string(getCoefficient(result, decimalPlace)) + "e" + utils::to_string(exponent); +} + +std::string Calculator::convertToNumberWithNegativeExponent(double result, long long base) +{ + double frac = (result - base) * pow(10, CalculatorConstants::highPrecision); + if (result < 0) { + frac *= -1; + } + auto fractionalPart = static_cast(round(frac)); + auto fracLength = utils::to_string(fractionalPart).length(); + auto exponent = CalculatorConstants::highPrecision - fracLength + 1; + if (exponent > CalculatorConstants::minusExpLength + 1) { + result *= pow(10, exponent); + auto exponentLength = utils::to_string(exponent).length(); + auto decimalPlace = CalculatorConstants::precision - exponentLength - CalculatorConstants::minusExpLength; + if (result < 0) { + decimalPlace -= 1; + } + return utils::to_string(getCoefficient(result, decimalPlace)) + "e-" + utils::to_string(exponent); + } + else if (result < 0) { + return utils::to_string(getCoefficient(result, CalculatorConstants::lowPrecision)); + } + return utils::to_string(getCoefficient(result, CalculatorConstants::precision)); +} + +long double Calculator::getCoefficient(double result, uint32_t precision) +{ + return std::roundl(result * pow(10, precision)) / pow(10, precision); +} diff --git a/module-apps/application-calculator/data/CalculatorUtility.hpp b/module-apps/application-calculator/data/CalculatorUtility.hpp index a3f2796e9..90f8c9b82 100644 --- a/module-apps/application-calculator/data/CalculatorUtility.hpp +++ b/module-apps/application-calculator/data/CalculatorUtility.hpp @@ -4,6 +4,17 @@ #pragma once #include +namespace CalculatorConstants +{ + inline constexpr auto veryLowPrecision = 4; + inline constexpr auto lowPrecision = 5; + inline constexpr auto precision = 6; + inline constexpr auto highPrecision = 8; + inline constexpr auto expLength = 1; + inline constexpr auto minusExpLength = 2; + inline constexpr auto maxStringLength = 7; +} // namespace CalculatorConstants + struct Result { std::string equation; @@ -18,6 +29,10 @@ class Calculator /// @return: new string with replaced all occurrences of given string to the new one in whole input std::string replaceAllOccurrences(std::string input, const std::string &from, const std::string &to); std::string prepareEquationForParser(std::string input); + std::string getValueThatFitsOnScreen(double result); + long double getCoefficient(double result, uint32_t precision); + std::string convertToNumberWithPositiveExponent(double result, uint32_t exponent); + std::string convertToNumberWithNegativeExponent(double result, long long base); public: Result calculate(std::string source); diff --git a/module-apps/application-calculator/tests/CalculatorUtility_tests.cpp b/module-apps/application-calculator/tests/CalculatorUtility_tests.cpp index cdf283a4c..4b7d8ede5 100644 --- a/module-apps/application-calculator/tests/CalculatorUtility_tests.cpp +++ b/module-apps/application-calculator/tests/CalculatorUtility_tests.cpp @@ -93,4 +93,51 @@ TEST_CASE("Calculator utilities") REQUIRE(result.equation == "1.79769e+308*2"); REQUIRE(result.isError); } + + SECTION("Round to fit in screen") + { + auto result = calculator.calculate("1.1234512345"); + REQUIRE(result.value == "1.123451"); + REQUIRE(!result.isError); + + result = calculator.calculate("0.0567891"); + REQUIRE(result.value == "0.056789"); + REQUIRE(!result.isError); + + result = calculator.calculate("-0.056789"); + REQUIRE(result.value == "-0.05679"); + REQUIRE(!result.isError); + + result = calculator.calculate("15.556789"); + REQUIRE(result.value == "15.55679"); + REQUIRE(!result.isError); + } + + SECTION("Change to scientific notation (number > 0)") + { + auto result = calculator.calculate("12345.55555"); + REQUIRE(result.value == "1.2346e4"); + REQUIRE(!result.isError); + } + + SECTION("Change to scientific notation (number < 0)") + { + auto result = calculator.calculate("-12345.55555"); + REQUIRE(result.value == "-1.235e4"); + REQUIRE(!result.isError); + } + + SECTION("Change to scientific notation (0 < number < 1)") + { + auto result = calculator.calculate("0.000456712"); + REQUIRE(result.value == "4.567e-4"); + REQUIRE(!result.isError); + } + + SECTION("Change to scientific notation (-1 < number < 0)") + { + auto result = calculator.calculate("-0.000456712"); + REQUIRE(result.value == "-4.57e-4"); + REQUIRE(!result.isError); + } } diff --git a/module-apps/application-calculator/widgets/CalculatorStyle.hpp b/module-apps/application-calculator/widgets/CalculatorStyle.hpp index 7b7fc7af0..7659e4679 100644 --- a/module-apps/application-calculator/widgets/CalculatorStyle.hpp +++ b/module-apps/application-calculator/widgets/CalculatorStyle.hpp @@ -34,6 +34,7 @@ namespace style::calculator inline constexpr auto full_stop = 0x002E; inline constexpr auto comma = 0x002C; inline constexpr auto equals = 0x003D; + inline constexpr auto zero = 0x0030; } // namespace codes namespace strings diff --git a/module-apps/application-calculator/windows/CalculatorMainWindow.cpp b/module-apps/application-calculator/windows/CalculatorMainWindow.cpp index 7aa76e250..da1af14fb 100644 --- a/module-apps/application-calculator/windows/CalculatorMainWindow.cpp +++ b/module-apps/application-calculator/windows/CalculatorMainWindow.cpp @@ -63,8 +63,15 @@ namespace gui if (!event.isShortPress()) { return false; } + if (event.is(gui::KeyCode::KEY_0) && mathOperationInput->getText() == "0") { + return true; + } auto lastChar = mathOperationInput->getText()[mathOperationInput->getText().length() - 1]; bool lastCharIsSymbol = isSymbol(lastChar); + if (lastChar == style::calculator::symbols::codes::zero && isSymbol(getPenultimate()) && + !isDecimalSeparator(getPenultimate()) && event.is(gui::KeyCode::KEY_0)) { + return true; + } if (event.keyCode == gui::KeyCode::KEY_UP) { writeEquation(lastCharIsSymbol, style::calculator::symbols::strings::plus); return true; @@ -89,6 +96,15 @@ namespace gui } return true; } + if (lastChar == style::calculator::symbols::codes::zero && isSymbol(getPenultimate()) && + !isDecimalSeparator(getPenultimate()) && !event.is(gui::KeyCode::KEY_0) && + !event.is(gui::KeyCode::KEY_PND) && !event.is(gui::KeyCode::KEY_ENTER)) { + mathOperationInput->removeChar(); + return false; + } + if (!event.is(gui::KeyCode::KEY_0) && mathOperationInput->getText() == "0") { + mathOperationInput->clear(); + } return false; }; } @@ -103,21 +119,36 @@ namespace gui character == style::calculator::symbols::codes::full_stop; } + bool CalculatorMainWindow::isDecimalSeparator(uint32_t character) + { + return character == style::calculator::symbols::codes::comma || + character == style::calculator::symbols::codes::full_stop; + } + + uint32_t CalculatorMainWindow::getPenultimate() + { + if (mathOperationInput->getText().length() > 1) { + return mathOperationInput->getText()[mathOperationInput->getText().length() - 2]; + } + return 0; + } + void CalculatorMainWindow::writeEquation(bool lastCharIsSymbol, const UTF8 &symbol) { if (!mathOperationInput->getText().empty()) { if (lastCharIsSymbol && symbol != style::calculator::symbols::strings::minus) { - mathOperationInput->setRichText( - std::string(mathOperationInput->getText()).erase(mathOperationInput->getText().length() - 1) + - symbol.c_str()); + if (!isSymbol(getPenultimate()) && mathOperationInput->getText().length() > 1) { + mathOperationInput->removeChar(); + mathOperationInput->addText(symbol); + } } else { - mathOperationInput->setRichText(mathOperationInput->getText() + symbol); + mathOperationInput->addText(symbol); } } else if (symbol == style::calculator::symbols::strings::minus) { - mathOperationInput->setRichText(mathOperationInput->getText() + symbol); + mathOperationInput->addText(symbol); } } @@ -126,7 +157,11 @@ namespace gui if (!mathOperationInput->getText().empty()) { std::vector symbolsIndexes; auto input = std::string(mathOperationInput->getText()).erase(mathOperationInput->getText().length() - 1); - symbolsIndexes.push_back(input.find_last_of(style::calculator::symbols::strings::minus)); + auto exponentIndex = input.find_last_of('e'); + auto minusIndex = input.find_last_of(style::calculator::symbols::strings::minus); + if (minusIndex != exponentIndex + 1) { + symbolsIndexes.push_back(minusIndex); + } symbolsIndexes.push_back(input.find_last_of(style::calculator::symbols::strings::plus)); symbolsIndexes.push_back(input.find_last_of(style::calculator::symbols::strings::division)); symbolsIndexes.push_back(input.find_last_of(style::calculator::symbols::strings::multiplication)); @@ -156,7 +191,7 @@ namespace gui if (inputEvent.keyCode == gui::KeyCode::KEY_ENTER) { auto result = Calculator().calculate(std::string(mathOperationInput->getText())); - mathOperationInput->setRichText(result.value); + mathOperationInput->setText(result.value); clearInput = result.isError; return true; } diff --git a/module-apps/application-calculator/windows/CalculatorMainWindow.hpp b/module-apps/application-calculator/windows/CalculatorMainWindow.hpp index a1720dd47..7208fd545 100644 --- a/module-apps/application-calculator/windows/CalculatorMainWindow.hpp +++ b/module-apps/application-calculator/windows/CalculatorMainWindow.hpp @@ -22,6 +22,8 @@ namespace gui void applyInputCallback(); bool isPreviousNumberDecimal(); bool isSymbol(uint32_t character); + bool isDecimalSeparator(uint32_t character); + uint32_t getPenultimate(); public: CalculatorMainWindow(app::Application *app, std::string name); diff --git a/module-apps/application-calendar/ApplicationCalendar.cpp b/module-apps/application-calendar/ApplicationCalendar.cpp index 8736f5c47..33a1902c8 100644 --- a/module-apps/application-calendar/ApplicationCalendar.cpp +++ b/module-apps/application-calendar/ApplicationCalendar.cpp @@ -147,7 +147,7 @@ namespace app void ApplicationCalendar::destroyUserInterface() {} - void ApplicationCalendar::switchToNoEventsWindow(const std::string &title, const TimePoint &dateFilter) + void ApplicationCalendar::switchToNoEventsWindow(const std::string &title, const calendar::TimePoint &dateFilter) { if (equivalentWindow == EquivalentWindow::DayEventsWindow) { popToWindow(gui::name::window::main_window); diff --git a/module-apps/application-calendar/ApplicationCalendar.hpp b/module-apps/application-calendar/ApplicationCalendar.hpp index e30f45568..15d353f4d 100644 --- a/module-apps/application-calendar/ApplicationCalendar.hpp +++ b/module-apps/application-calendar/ApplicationCalendar.hpp @@ -55,7 +55,8 @@ namespace app } void createUserInterface() override; void destroyUserInterface() override; - void switchToNoEventsWindow(const std::string &title = "", const TimePoint &dateFilter = TimePoint()); + void switchToNoEventsWindow(const std::string &title = "", + const calendar::TimePoint &dateFilter = calendar::TimePoint()); static const std::map reminderOptions; static const std::map repeatOptions; diff --git a/module-apps/application-calendar/data/CalendarData.hpp b/module-apps/application-calendar/data/CalendarData.hpp index c61c518b5..1e27e2e48 100644 --- a/module-apps/application-calendar/data/CalendarData.hpp +++ b/module-apps/application-calendar/data/CalendarData.hpp @@ -42,7 +42,7 @@ class DayMonthData : public gui::SwitchData { protected: std::string dayMonth; - TimePoint dateFilter; + calendar::TimePoint dateFilter; public: DayMonthData() = default; @@ -52,12 +52,12 @@ class DayMonthData : public gui::SwitchData return dayMonth; }; - TimePoint getDateFilter() + calendar::TimePoint getDateFilter() { return dateFilter; }; - virtual void setData(std::string dayMonthText, const TimePoint &dateNumb) + virtual void setData(std::string dayMonthText, const calendar::TimePoint &dateNumb) { dayMonth = dayMonthText; dateFilter = dateNumb; diff --git a/module-apps/application-calendar/data/dateCommon.hpp b/module-apps/application-calendar/data/dateCommon.hpp index 107d5dec3..f3d852d24 100644 --- a/module-apps/application-calendar/data/dateCommon.hpp +++ b/module-apps/application-calendar/data/dateCommon.hpp @@ -9,13 +9,13 @@ #include #include -using namespace std::chrono; -using namespace std::chrono_literals; - -using Clock = system_clock; -using TimePoint = time_point; -using YearMonthDay = date::year_month_day; -using YearMonthDayLast = date::year_month_day_last; +namespace calendar +{ + using Clock = std::chrono::system_clock; + using TimePoint = std::chrono::time_point; + using YearMonthDay = date::year_month_day; + using YearMonthDayLast = date::year_month_day_last; +} // namespace calendar inline constexpr auto max_month_day = 48; @@ -43,7 +43,7 @@ enum class Repeat yearly }; -inline constexpr TimePoint TIME_POINT_INVALID = date::sys_days{date::January / 1 / 1970}; +inline constexpr calendar::TimePoint TIME_POINT_INVALID = date::sys_days{date::January / 1 / 1970}; inline constexpr uint32_t yearDigitsNumb = 4, monthDigitsNumb = 2, dayDigitsNumb = 2, HourDigitsNumb = 2, MinDigitsNumb = 2, SecDigitsNumb = 2; @@ -88,34 +88,34 @@ inline time_t GetAsUTCTime(int year, int month, int day, int hour = 0, int minut return basetime + GetDiffLocalWithUTCTime(); } -inline TimePoint TimePointFromTimeT(const time_t &time) +inline calendar::TimePoint TimePointFromTimeT(const time_t &time) { - return system_clock::from_time_t(time); + return std::chrono::system_clock::from_time_t(time); } -inline time_t TimePointToTimeT(const TimePoint &tp) +inline time_t TimePointToTimeT(const calendar::TimePoint &tp) { - return system_clock::to_time_t(tp); + return std::chrono::system_clock::to_time_t(tp); } -inline TimePoint TimePointNow() +inline calendar::TimePoint TimePointNow() { utils::time::Timestamp timestamp; return TimePointFromTimeT(timestamp.getTime()); } -inline std::string TimePointToString(const TimePoint &tp) +inline std::string TimePointToString(const calendar::TimePoint &tp) { - return date::format("%F %T", time_point_cast(tp)); + return date::format("%F %T", std::chrono::time_point_cast(tp)); } -inline auto TimePointToHourMinSec(const TimePoint &tp) +inline auto TimePointToHourMinSec(const calendar::TimePoint &tp) { auto dp = date::floor(tp); return date::make_time(tp - dp); } -inline uint32_t TimePointToHour24H(const TimePoint &tp) +inline uint32_t TimePointToHour24H(const calendar::TimePoint &tp) { auto time = TimePointToTimeT(tp); utils::time::Timestamp timestamp(time); @@ -123,7 +123,7 @@ inline uint32_t TimePointToHour24H(const TimePoint &tp) return hour; } -inline uint32_t TimePointToMinutes(const TimePoint &tp) +inline uint32_t TimePointToMinutes(const calendar::TimePoint &tp) { auto time = TimePointToTimeT(tp); utils::time::Timestamp timestamp(time); @@ -131,7 +131,7 @@ inline uint32_t TimePointToMinutes(const TimePoint &tp) return minute; } -inline TimePoint getFirstWeekDay(const TimePoint &tp) +inline calendar::TimePoint getFirstWeekDay(const calendar::TimePoint &tp) { date::year_month_day yearMonthDay = date::year_month_day{date::floor(tp)}; auto hourV = TimePointToHour24H(tp); @@ -146,12 +146,12 @@ inline TimePoint getFirstWeekDay(const TimePoint &tp) return finalDateTime; } -inline std::string TimePointToString(const TimePoint &tp, date::months months) +inline std::string TimePointToString(const calendar::TimePoint &tp, date::months months) { date::year_month_day yearMonthDay = date::year_month_day{date::floor(tp)}; date::year_month_day yearMonthDayLast = yearMonthDay.year() / yearMonthDay.month() / date::last; - TimePoint timePoint; + calendar::TimePoint timePoint; if ((static_cast(yearMonthDay.month()) + months.count()) <= 12) { if (yearMonthDayLast.day() == yearMonthDay.day()) { @@ -173,41 +173,41 @@ inline std::string TimePointToString(const TimePoint &tp, date::months months) timePoint = date::sys_days{yearMonthDay.year() / yearMonthDay.month() / yearMonthDay.day()}; } } - return date::format("%F %T", time_point_cast(timePoint)); + return date::format("%F %T", std::chrono::time_point_cast(timePoint)); } -inline std::string TimePointToLocalizedDateString(const TimePoint &tp, const std::string format = "") +inline std::string TimePointToLocalizedDateString(const calendar::TimePoint &tp, const std::string format = "") { auto time = TimePointToTimeT(tp); utils::time::Date timestamp(time); return timestamp.str(format); } -inline std::string TimePointToLocalizedTimeString(const TimePoint &tp, const std::string format = "") +inline std::string TimePointToLocalizedTimeString(const calendar::TimePoint &tp, const std::string format = "") { auto time = TimePointToTimeT(tp); utils::time::Time timestamp(time); return timestamp.str(format); } -inline TimePoint TimePointFromString(const char *s1) +inline calendar::TimePoint TimePointFromString(const char *s1) { - TimePoint tp; + calendar::TimePoint tp; std::istringstream(s1) >> date::parse("%F %T", tp); return tp; } -inline YearMonthDay TimePointToYearMonthDay(const TimePoint &tp) +inline calendar::YearMonthDay TimePointToYearMonthDay(const calendar::TimePoint &tp) { return date::year_month_day{date::floor(tp)}; } -inline TimePoint TimePointFromYearMonthDay(const YearMonthDay &ymd) +inline calendar::TimePoint TimePointFromYearMonthDay(const calendar::YearMonthDay &ymd) { return date::sys_days{ymd.year() / ymd.month() / ymd.day()}; } -inline time_t TimePointToMin(const TimePoint &tp) +inline time_t TimePointToMin(const calendar::TimePoint &tp) { auto time = TimePointToTimeT(tp); auto duration = new utils::time::Duration(time); @@ -215,7 +215,7 @@ inline time_t TimePointToMin(const TimePoint &tp) return minutes; } -inline uint32_t TimePointToHour12H(const TimePoint &tp) +inline uint32_t TimePointToHour12H(const calendar::TimePoint &tp) { auto time = TimePointToTimeT(tp); utils::time::Timestamp timestamp(time); @@ -226,7 +226,7 @@ inline uint32_t TimePointToHour12H(const TimePoint &tp) return hour; } -inline std::string TimePointToHourString12H(const TimePoint &tp) +inline std::string TimePointToHourString12H(const calendar::TimePoint &tp) { auto hour = utils::time::Timestamp(TimePointToTimeT(tp)).get_UTC_date_time_sub_value(utils::time::GetParameters::Hour); @@ -234,14 +234,14 @@ inline std::string TimePointToHourString12H(const TimePoint &tp) return utils::to_string(hour12h); } -inline std::string TimePointToHourString24H(const TimePoint &tp) +inline std::string TimePointToHourString24H(const calendar::TimePoint &tp) { auto hour = utils::time::Timestamp(TimePointToTimeT(tp)).get_UTC_date_time_sub_value(utils::time::GetParameters::Hour); return utils::to_string(hour); } -inline std::string TimePointToMinutesString(const TimePoint &tp) +inline std::string TimePointToMinutesString(const calendar::TimePoint &tp) { auto minute = TimePointToMinutes(tp); auto minuteString = std::to_string(minute); @@ -252,9 +252,9 @@ inline std::string TimePointToMinutesString(const TimePoint &tp) } // 0: Monday, 1: Tuesday ... 6: Sunday -inline unsigned int WeekdayIndexFromTimePoint(const TimePoint &tp) +inline unsigned int WeekdayIndexFromTimePoint(const calendar::TimePoint &tp) { - auto ymw = date::year_month_weekday{floor(tp)}; + auto ymw = date::year_month_weekday{std::chrono::floor(tp)}; return ymw.weekday().iso_encoding() - 1; } diff --git a/module-apps/application-calendar/models/AllEventsModel.cpp b/module-apps/application-calendar/models/AllEventsModel.cpp index 93872f156..9a5a99710 100644 --- a/module-apps/application-calendar/models/AllEventsModel.cpp +++ b/module-apps/application-calendar/models/AllEventsModel.cpp @@ -83,8 +83,8 @@ auto AllEventsModel::handleQueryResponse(db::QueryResult *queryResult) -> bool auto eventShift = app->getEventShift(); if (eventShift) { for (auto &record : records) { - record.date_from += hours(eventShift); - record.date_till += hours(eventShift); + record.date_from += std::chrono::hours(eventShift); + record.date_till += std::chrono::hours(eventShift); } } return this->updateRecords(std::move(records)); diff --git a/module-apps/application-calendar/models/DayEventsModel.cpp b/module-apps/application-calendar/models/DayEventsModel.cpp index 8c5f55e58..b439da6e4 100644 --- a/module-apps/application-calendar/models/DayEventsModel.cpp +++ b/module-apps/application-calendar/models/DayEventsModel.cpp @@ -82,8 +82,8 @@ auto DayEventsModel::handleQueryResponse(db::QueryResult *queryResult) -> bool auto eventShift = app->getEventShift(); if (eventShift) { for (auto &record : records) { - record.date_from += hours(eventShift); - record.date_till += hours(eventShift); + record.date_from += std::chrono::hours(eventShift); + record.date_till += std::chrono::hours(eventShift); } } return updateRecords(std::move(records)); @@ -95,7 +95,7 @@ auto DayEventsModel::handleQueryResponse(db::QueryResult *queryResult) -> bool return false; } -void DayEventsModel::setFilters(TimePoint from, TimePoint till, const std::string &dayMonth) +void DayEventsModel::setFilters(calendar::TimePoint from, calendar::TimePoint till, const std::string &dayMonth) { this->filterFrom = from; this->filterTill = till; diff --git a/module-apps/application-calendar/models/DayEventsModel.hpp b/module-apps/application-calendar/models/DayEventsModel.hpp index 2cfac0f24..b223f0dda 100644 --- a/module-apps/application-calendar/models/DayEventsModel.hpp +++ b/module-apps/application-calendar/models/DayEventsModel.hpp @@ -15,13 +15,13 @@ class DayEventsModel : public app::DatabaseModel, { app::Application *application = nullptr; std::string dayMonthTitle; - TimePoint filterFrom = TIME_POINT_INVALID; - TimePoint filterTill = TIME_POINT_INVALID; + calendar::TimePoint filterFrom = TIME_POINT_INVALID; + calendar::TimePoint filterTill = TIME_POINT_INVALID; public: DayEventsModel(app::Application *app); - void setFilters(TimePoint from, TimePoint till, const std::string &dayMonth); + void setFilters(calendar::TimePoint from, calendar::TimePoint till, const std::string &dayMonth); bool updateRecords(std::vector records) override; auto handleQueryResponse(db::QueryResult *) -> bool; diff --git a/module-apps/application-calendar/widgets/EventDateItem.cpp b/module-apps/application-calendar/widgets/EventDateItem.cpp index 94e5c0379..73e749875 100644 --- a/module-apps/application-calendar/widgets/EventDateItem.cpp +++ b/module-apps/application-calendar/widgets/EventDateItem.cpp @@ -149,7 +149,7 @@ namespace gui return true; } - YearMonthDay EventDateItem::validateDate() + calendar::YearMonthDay EventDateItem::validateDate() { auto actualDate = TimePointToYearMonthDay(TimePointNow()); uint32_t day; @@ -185,7 +185,7 @@ namespace gui } month = std::clamp(static_cast(month), 1u, static_cast(date::dec)); - YearMonthDayLast max_date = date::year(year) / date::month(month) / date::last; + calendar::YearMonthDayLast max_date = date::year(year) / date::month(month) / date::last; if (day > static_cast(max_date.day())) { dayInput->setText(std::to_string(static_cast(max_date.day()))); } @@ -194,7 +194,7 @@ namespace gui return date::year(year) / date::month(month) / date::day(day); } - const YearMonthDay EventDateItem::getChosenDate() + const calendar::YearMonthDay EventDateItem::getChosenDate() { return validateDate(); } diff --git a/module-apps/application-calendar/widgets/EventDateItem.hpp b/module-apps/application-calendar/widgets/EventDateItem.hpp index 2a0ecdff1..3d0cf8edb 100644 --- a/module-apps/application-calendar/widgets/EventDateItem.hpp +++ b/module-apps/application-calendar/widgets/EventDateItem.hpp @@ -24,12 +24,12 @@ namespace gui void buildInterface(); void applyItemSpecificProperties(gui::Text *item); void applyCallbacks(); - YearMonthDay validateDate(); + calendar::YearMonthDay validateDate(); public: EventDateItem(); - const YearMonthDay getChosenDate(); + const calendar::YearMonthDay getChosenDate(); // virtual methods from Item bool onDimensionChanged(const BoundingBox &oldDim, const BoundingBox &newDim) override; }; diff --git a/module-apps/application-calendar/widgets/EventTimeItem.cpp b/module-apps/application-calendar/widgets/EventTimeItem.cpp index 93bd99da5..cb1ad4345 100644 --- a/module-apps/application-calendar/widgets/EventTimeItem.cpp +++ b/module-apps/application-calendar/widgets/EventTimeItem.cpp @@ -433,9 +433,9 @@ namespace gui } } - TimePoint EventTimeItem::calculateEventTime(YearMonthDay date, - std::chrono::hours hours, - std::chrono::minutes minutes) + calendar::TimePoint EventTimeItem::calculateEventTime(calendar::YearMonthDay date, + std::chrono::hours hours, + std::chrono::minutes minutes) { return TimePointFromYearMonthDay(date) + hours + minutes; } diff --git a/module-apps/application-calendar/widgets/EventTimeItem.hpp b/module-apps/application-calendar/widgets/EventTimeItem.hpp index a93dfcf01..5ee53bfd5 100644 --- a/module-apps/application-calendar/widgets/EventTimeItem.hpp +++ b/module-apps/application-calendar/widgets/EventTimeItem.hpp @@ -43,7 +43,9 @@ namespace gui std::chrono::minutes end_hour, uint32_t start_minutes, uint32_t end_minutes); - TimePoint calculateEventTime(YearMonthDay date, std::chrono::hours hours, std::chrono::minutes minutes); + calendar::TimePoint calculateEventTime(calendar::YearMonthDay date, + std::chrono::hours hours, + std::chrono::minutes minutes); public: EventTimeItem(const std::string &description, diff --git a/module-apps/application-calendar/widgets/MonthBox.cpp b/module-apps/application-calendar/widgets/MonthBox.cpp index 4b44d5f08..8d3cce7a2 100644 --- a/module-apps/application-calendar/widgets/MonthBox.cpp +++ b/module-apps/application-calendar/widgets/MonthBox.cpp @@ -58,7 +58,7 @@ namespace gui auto mainWindow = dynamic_cast(parent); if (mainWindow->returnedFromWindow) { focusChangedCallback = [=](Item &item) { - YearMonthDay date = monthFilterValue.year() / monthFilterValue.month() / date::last; + calendar::YearMonthDay date = monthFilterValue.year() / monthFilterValue.month() / date::last; if (unsigned(date.day()) < mainWindow->dayFocusedBefore) { setFocusOnElement(unsigned(date.day()) - 1); } diff --git a/module-apps/application-calendar/windows/AllEventsWindow.cpp b/module-apps/application-calendar/windows/AllEventsWindow.cpp index e3296183f..901f92755 100644 --- a/module-apps/application-calendar/windows/AllEventsWindow.cpp +++ b/module-apps/application-calendar/windows/AllEventsWindow.cpp @@ -34,7 +34,6 @@ namespace gui { AppWindow::buildInterface(); - topBar->setActive(gui::TopBar::Elements::TIME, true); bottomBar->setActive(gui::BottomBar::Side::RIGHT, true); bottomBar->setText(gui::BottomBar::Side::RIGHT, utils::localize.get(style::strings::common::back)); bottomBar->setText(gui::BottomBar::Side::CENTER, utils::localize.get(style::strings::common::open)); diff --git a/module-apps/application-calendar/windows/AllEventsWindow.hpp b/module-apps/application-calendar/windows/AllEventsWindow.hpp index 5d1b5d5d8..af0fc5d31 100644 --- a/module-apps/application-calendar/windows/AllEventsWindow.hpp +++ b/module-apps/application-calendar/windows/AllEventsWindow.hpp @@ -16,7 +16,7 @@ namespace gui gui::Image *leftArrowImage = nullptr; gui::Image *newDayEventImage = nullptr; - TimePoint dateFilter = TimePointNow(); + calendar::TimePoint dateFilter = TimePointNow(); gui::ListView *allEventsList = nullptr; std::shared_ptr allEventsModel = nullptr; diff --git a/module-apps/application-calendar/windows/CalendarMainWindow.cpp b/module-apps/application-calendar/windows/CalendarMainWindow.cpp index 91b5d3d3c..5702f305e 100644 --- a/module-apps/application-calendar/windows/CalendarMainWindow.cpp +++ b/module-apps/application-calendar/windows/CalendarMainWindow.cpp @@ -100,9 +100,9 @@ namespace gui } case KeyCode::KEY_LEFT: { LOG_DEBUG("Call borderCallback -> go to the previous element"); - auto it = monthBox->getNavigationFocusedItem(); - if (monthBox->nextNavigationItem(std::prev(it)) != nullptr) { - monthBox->setFocusItem(monthBox->nextNavigationItem(std::prev(it))); + auto it = std::prev(monthBox->getNavigationFocusedItem()); + if (it != monthBox->children.end() && (*it)->isActive()) { + monthBox->setFocusItem(*it); } else { monthBox->setFocusOnLastElement(); @@ -111,9 +111,9 @@ namespace gui } case KeyCode::KEY_RIGHT: { LOG_DEBUG("Call borderCallback -> go to the next element"); - auto it = monthBox->getNavigationFocusedItem(); - if (monthBox->nextNavigationItem(std::next(it)) != nullptr) { - monthBox->setFocusItem(monthBox->nextNavigationItem(std::next(it))); + auto it = std::next(monthBox->getNavigationFocusedItem()); + if (it != monthBox->children.end() && (*it)->isActive()) { + monthBox->setFocusItem(*it); } else { monthBox->setFocusOnElement(0); @@ -197,8 +197,8 @@ namespace gui void CalendarMainWindow::filterRequest() { - YearMonthDay date_from = actualDate.year() / actualDate.month() / 1; - YearMonthDay date_till = date_from + date::months{1}; + calendar::YearMonthDay date_from = actualDate.year() / actualDate.month() / 1; + calendar::YearMonthDay date_till = date_from + date::months{1}; auto filter_from = TimePointFromYearMonthDay(date_from); auto filter_till = TimePointFromYearMonthDay(date_till); LOG_DEBUG("filter: %s", TimePointToString(filter_till).c_str()); diff --git a/module-apps/application-calendar/windows/CustomRepeatWindow.cpp b/module-apps/application-calendar/windows/CustomRepeatWindow.cpp index df16e2954..d82d96a59 100644 --- a/module-apps/application-calendar/windows/CustomRepeatWindow.cpp +++ b/module-apps/application-calendar/windows/CustomRepeatWindow.cpp @@ -28,7 +28,6 @@ namespace gui { AppWindow::buildInterface(); - topBar->setActive(gui::TopBar::Elements::TIME, true); bottomBar->setActive(gui::BottomBar::Side::RIGHT, true); bottomBar->setText(gui::BottomBar::Side::RIGHT, utils::localize.get(style::strings::common::back)); diff --git a/module-apps/application-calendar/windows/DayEventsWindow.cpp b/module-apps/application-calendar/windows/DayEventsWindow.cpp index 2f57516f7..e958f3eb4 100644 --- a/module-apps/application-calendar/windows/DayEventsWindow.cpp +++ b/module-apps/application-calendar/windows/DayEventsWindow.cpp @@ -64,7 +64,6 @@ namespace gui { AppWindow::buildInterface(); - topBar->setActive(gui::TopBar::Elements::TIME, true); bottomBar->setActive(gui::BottomBar::Side::RIGHT, true); bottomBar->setText(gui::BottomBar::Side::RIGHT, utils::localize.get(style::strings::common::back)); bottomBar->setText(gui::BottomBar::Side::CENTER, utils::localize.get(style::strings::common::open)); diff --git a/module-apps/application-calendar/windows/DayEventsWindow.hpp b/module-apps/application-calendar/windows/DayEventsWindow.hpp index cc5450b4f..0a1e7282f 100644 --- a/module-apps/application-calendar/windows/DayEventsWindow.hpp +++ b/module-apps/application-calendar/windows/DayEventsWindow.hpp @@ -19,7 +19,7 @@ namespace gui class DayEventsWindow : public gui::AppWindow { std::string dayMonthTitle; - TimePoint filterFrom; + calendar::TimePoint filterFrom; gui::Image *leftArrowImage = nullptr; gui::Image *newDayEventImage = nullptr; gui::ListView *dayEventsList = nullptr; diff --git a/module-apps/application-calendar/windows/EventDetailWindow.cpp b/module-apps/application-calendar/windows/EventDetailWindow.cpp index 1921bf61a..230ccbfd7 100644 --- a/module-apps/application-calendar/windows/EventDetailWindow.cpp +++ b/module-apps/application-calendar/windows/EventDetailWindow.cpp @@ -28,7 +28,6 @@ namespace gui { AppWindow::buildInterface(); - topBar->setActive(gui::TopBar::Elements::TIME, true); bottomBar->setActive(gui::BottomBar::Side::RIGHT, true); bottomBar->setActive(gui::BottomBar::Side::LEFT, true); bottomBar->setText(gui::BottomBar::Side::RIGHT, utils::localize.get(style::strings::common::back)); diff --git a/module-apps/application-calendar/windows/EventReminderWindow.cpp b/module-apps/application-calendar/windows/EventReminderWindow.cpp index 85329e2a5..2ec298f00 100644 --- a/module-apps/application-calendar/windows/EventReminderWindow.cpp +++ b/module-apps/application-calendar/windows/EventReminderWindow.cpp @@ -38,14 +38,21 @@ namespace gui buildInterface(); } + top_bar::Configuration EventReminderWindow::configureTopBar(top_bar::Configuration appConfiguration) + { + using namespace top_bar; + appConfiguration.enable({Indicator::Signal, + Indicator::Time, + Indicator::Battery, + Indicator::SimCard, + Indicator::NetworkAccessTechnology}); + return appConfiguration; + } + void EventReminderWindow::buildInterface() { AppWindow::buildInterface(); - topBar->setActive(TopBar::Elements::BATTERY, true); - topBar->setActive(TopBar::Elements::SIGNAL, true); - topBar->setActive(gui::TopBar::Elements::TIME, true); - bottomBar->setActive(gui::BottomBar::Side::CENTER, true); bottomBar->setText(gui::BottomBar::Side::CENTER, utils::localize.get(style::strings::common::ok)); bottomBar->setBorderColor(ColorNoColor); diff --git a/module-apps/application-calendar/windows/EventReminderWindow.hpp b/module-apps/application-calendar/windows/EventReminderWindow.hpp index 48b0bfc52..3cf03aba1 100644 --- a/module-apps/application-calendar/windows/EventReminderWindow.hpp +++ b/module-apps/application-calendar/windows/EventReminderWindow.hpp @@ -42,6 +42,7 @@ namespace gui void rebuild() override; void buildInterface() override; void destroyInterface() override; + top_bar::Configuration configureTopBar(top_bar::Configuration appConfiguration) override; auto handleSwitchData(SwitchData *data) -> bool override; }; diff --git a/module-apps/application-calendar/windows/NewEditEventWindow.cpp b/module-apps/application-calendar/windows/NewEditEventWindow.cpp index 0ff200e1b..fb8e316e2 100644 --- a/module-apps/application-calendar/windows/NewEditEventWindow.cpp +++ b/module-apps/application-calendar/windows/NewEditEventWindow.cpp @@ -25,7 +25,6 @@ namespace gui { AppWindow::buildInterface(); - topBar->setActive(gui::TopBar::Elements::TIME, true); bottomBar->setActive(gui::BottomBar::Side::RIGHT, true); bottomBar->setActive(gui::BottomBar::Side::CENTER, true); bottomBar->setText(gui::BottomBar::Side::RIGHT, utils::localize.get(style::strings::common::back)); diff --git a/module-apps/application-call/ApplicationCall.cpp b/module-apps/application-call/ApplicationCall.cpp index 2a47b7512..50ac4c408 100644 --- a/module-apps/application-call/ApplicationCall.cpp +++ b/module-apps/application-call/ApplicationCall.cpp @@ -33,6 +33,12 @@ namespace app ApplicationCall::ApplicationCall(std::string name, std::string parent, StartInBackground startInBackground) : Application(name, parent, startInBackground, app::call_stack_size) { + using namespace gui::top_bar; + topBarManager->enableIndicators({Indicator::Signal, + Indicator::Time, + Indicator::Battery, + Indicator::SimCard, + Indicator::NetworkAccessTechnology}); addActionReceiver(manager::actions::Call, [this](auto &&data) { switchWindow(window::name_call, std::forward(data)); return msgHandled(); diff --git a/module-apps/application-call/windows/CallWindow.cpp b/module-apps/application-call/windows/CallWindow.cpp index 628603d23..620cb0874 100644 --- a/module-apps/application-call/windows/CallWindow.cpp +++ b/module-apps/application-call/windows/CallWindow.cpp @@ -58,10 +58,6 @@ namespace gui { AppWindow::buildInterface(); - topBar->setActive(gui::TopBar::Elements::BATTERY, true); - topBar->setActive(gui::TopBar::Elements::SIGNAL, true); - topBar->setActive(gui::TopBar::Elements::TIME, true); - bottomBar->setActive(BottomBar::Side::CENTER, true); bottomBar->setActive(BottomBar::Side::RIGHT, true); diff --git a/module-apps/application-call/windows/EnterNumberWindow.cpp b/module-apps/application-call/windows/EnterNumberWindow.cpp index 4f08de103..8c3194606 100644 --- a/module-apps/application-call/windows/EnterNumberWindow.cpp +++ b/module-apps/application-call/windows/EnterNumberWindow.cpp @@ -58,10 +58,6 @@ namespace gui bottomBar->setText(BottomBar::Side::CENTER, utils::localize.get("common_add")); bottomBar->setText(BottomBar::Side::RIGHT, utils::localize.get("app_call_clear")); - topBar->setActive(TopBar::Elements::SIGNAL, true); - topBar->setActive(TopBar::Elements::BATTERY, true); - topBar->setActive(TopBar::Elements::TIME, true); - numberLabel = new gui::Label(this, numberLabel::x, numberLabel::y, numberLabel::w, numberLabel::h); numberLabel->setPenWidth(numberLabel::borderW); numberLabel->setFont(style::window::font::largelight); diff --git a/module-apps/application-calllog/windows/CallLogDetailsWindow.cpp b/module-apps/application-calllog/windows/CallLogDetailsWindow.cpp index 39f5cd594..054388da0 100644 --- a/module-apps/application-calllog/windows/CallLogDetailsWindow.cpp +++ b/module-apps/application-calllog/windows/CallLogDetailsWindow.cpp @@ -82,8 +82,6 @@ namespace gui bottomBar->setText(BottomBar::Side::CENTER, utils::localize.get(style::strings::common::call)); bottomBar->setText(BottomBar::Side::RIGHT, utils::localize.get(style::strings::common::back)); - topBar->setActive(TopBar::Elements::TIME, true); - // NOTE: height of all labels is set using decorators // Information diff --git a/module-apps/application-calllog/windows/CallLogMainWindow.cpp b/module-apps/application-calllog/windows/CallLogMainWindow.cpp index 214957108..d5b258410 100644 --- a/module-apps/application-calllog/windows/CallLogMainWindow.cpp +++ b/module-apps/application-calllog/windows/CallLogMainWindow.cpp @@ -47,8 +47,6 @@ namespace gui bottomBar->setText(BottomBar::Side::CENTER, utils::localize.get(style::strings::common::open)); bottomBar->setText(BottomBar::Side::RIGHT, utils::localize.get(style::strings::common::back)); - topBar->setActive(TopBar::Elements::TIME, true); - list = new gui::ListView(this, mainWindow::x, mainWindow::y, mainWindow::w, mainWindow::h, calllogModel); setFocusItem(list); diff --git a/module-apps/application-desktop/ApplicationDesktop.cpp b/module-apps/application-desktop/ApplicationDesktop.cpp index 34f8f8ad7..cc897dca5 100644 --- a/module-apps/application-desktop/ApplicationDesktop.cpp +++ b/module-apps/application-desktop/ApplicationDesktop.cpp @@ -8,6 +8,7 @@ #include "windows/MenuWindow.hpp" #include "windows/PinLockWindow.hpp" #include "windows/PowerOffWindow.hpp" +#include "windows/DeadBatteryWindow.hpp" #include "windows/LockedInfoWindow.hpp" #include "windows/Reboot.hpp" #include "windows/Update.hpp" @@ -37,6 +38,12 @@ namespace app ApplicationDesktop::ApplicationDesktop(std::string name, std::string parent, StartInBackground startInBackground) : Application(name, parent, startInBackground), lockHandler(this) { + using namespace gui::top_bar; + topBarManager->enableIndicators({Indicator::Signal, + Indicator::Time, + Indicator::Battery, + Indicator::SimCard, + Indicator::NetworkAccessTechnology}); busChannels.push_back(sys::BusChannels::ServiceDBNotifications); addActionReceiver(app::manager::actions::RequestPin, [this](auto &&data) { @@ -88,6 +95,11 @@ namespace app handleLowBatteryNotification(std::move(data)); return msgHandled(); }); + + addActionReceiver(app::manager::actions::SystemBrownout, [this](auto &&data) { + switchWindow(app::window::name::dead_battery, std::move(data)); + return msgHandled(); + }); } ApplicationDesktop::~ApplicationDesktop() @@ -317,11 +329,15 @@ namespace app std::make_shared(updateos::UpdateMessageType::UpdateCheckForUpdateOnce); sys::Bus::SendUnicast(msgToSend, service::name::service_desktop, this); - settings->registerValueChange(settings::SystemProperties::activeSim, - [this](std::string value) { activeSimChanged(value); }); + settings->registerValueChange( + settings::SystemProperties::activeSim, + [this](std::string value) { activeSimChanged(value); }, + settings::SettingsScope::Global); Store::GSM::get()->selected = Store::GSM::SIM::NONE; - settings->registerValueChange(settings::SystemProperties::lockPassHash, - [this](std::string value) { lockPassHashChanged(value); }); + settings->registerValueChange( + settings::SystemProperties::lockPassHash, + [this](std::string value) { lockPassHashChanged(value); }, + settings::SettingsScope::Global); return sys::ReturnCodes::Success; } @@ -329,6 +345,7 @@ namespace app sys::ReturnCodes ApplicationDesktop::DeinitHandler() { LOG_INFO("DeinitHandler"); + settings->unregisterValueChange(); return sys::ReturnCodes::Success; } @@ -347,6 +364,9 @@ namespace app windowsFactory.attach(desktop_poweroff, [](Application *app, const std::string newname) { return std::make_unique(app); }); + windowsFactory.attach(dead_battery, [](Application *app, const std::string newname) { + return std::make_unique(app); + }); windowsFactory.attach(desktop_locked, [](Application *app, const std::string newname) { return std::make_unique(app); }); diff --git a/module-apps/application-desktop/ApplicationDesktop.hpp b/module-apps/application-desktop/ApplicationDesktop.hpp index a32086ec4..a90fc34dd 100644 --- a/module-apps/application-desktop/ApplicationDesktop.hpp +++ b/module-apps/application-desktop/ApplicationDesktop.hpp @@ -107,7 +107,8 @@ namespace app manager::actions::ShowMMIPush, manager::actions::ShowMMIResult, manager::actions::DisplayCMEError, - manager::actions::DisplayLowBatteryNotification}}; + manager::actions::DisplayLowBatteryNotification, + manager::actions::SystemBrownout}}; } }; diff --git a/module-apps/application-desktop/CMakeLists.txt b/module-apps/application-desktop/CMakeLists.txt index 7afae3c13..883041172 100644 --- a/module-apps/application-desktop/CMakeLists.txt +++ b/module-apps/application-desktop/CMakeLists.txt @@ -27,6 +27,7 @@ target_sources( ${PROJECT_NAME} "${CMAKE_CURRENT_LIST_DIR}/windows/PinLockWindow.cpp" "${CMAKE_CURRENT_LIST_DIR}/windows/MenuWindow.cpp" "${CMAKE_CURRENT_LIST_DIR}/windows/PowerOffWindow.cpp" + "${CMAKE_CURRENT_LIST_DIR}/windows/DeadBatteryWindow.cpp" "${CMAKE_CURRENT_LIST_DIR}/windows/LockedInfoWindow.cpp" "${CMAKE_CURRENT_LIST_DIR}/windows/Reboot.cpp" "${CMAKE_CURRENT_LIST_DIR}/windows/Update.cpp" diff --git a/module-apps/application-desktop/windows/DeadBatteryWindow.cpp b/module-apps/application-desktop/windows/DeadBatteryWindow.cpp new file mode 100644 index 000000000..5ca822af2 --- /dev/null +++ b/module-apps/application-desktop/windows/DeadBatteryWindow.cpp @@ -0,0 +1,53 @@ +// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. +// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md + +#include "DeadBatteryWindow.hpp" +#include "InputEvent.hpp" +#include "gui/widgets/Image.hpp" +#include "gui/widgets/BottomBar.hpp" +#include "gui/widgets/TopBar.hpp" +#include "log/log.hpp" +#include +#include +#include + +namespace gui +{ + namespace + { + constexpr inline auto SHUTDOWN_TIMER_MS = 500; + constexpr inline auto IMG_POS_X = 176; + constexpr inline auto IMG_POS_Y = 250; + } // namespace + + DeadBatteryWindow::DeadBatteryWindow(app::Application *app) : AppWindow(app, app::window::name::dead_battery) + { + buildInterface(); + } + + void DeadBatteryWindow::rebuild() + { + destroyInterface(); + buildInterface(); + } + + void DeadBatteryWindow::buildInterface() + { + AppWindow::buildInterface(); + bottomBar->setVisible(false); + topBar->setVisible(false); + + image = new gui::Image(this, IMG_POS_X, IMG_POS_Y, 0, 0, "dead_battery_W_G"); + } + + void DeadBatteryWindow::onBeforeShow(ShowMode mode, SwitchData *data) + { + app::manager::Controller::sendAction(application, app::manager::actions::CloseSystem); + } + + void DeadBatteryWindow::destroyInterface() + { + erase(); + image = nullptr; + } +} /* namespace gui */ diff --git a/module-apps/application-desktop/windows/DeadBatteryWindow.hpp b/module-apps/application-desktop/windows/DeadBatteryWindow.hpp new file mode 100644 index 000000000..4c30724e9 --- /dev/null +++ b/module-apps/application-desktop/windows/DeadBatteryWindow.hpp @@ -0,0 +1,24 @@ +// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. +// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md + +#pragma once + +#include +#include "AppWindow.hpp" + +namespace gui +{ + class DeadBatteryWindow : public AppWindow + { + public: + explicit DeadBatteryWindow(app::Application *app); + void rebuild() override; + void buildInterface() override; + void destroyInterface() override; + void onBeforeShow(ShowMode mode, SwitchData *data) override; + + private: + gui::Image *image = nullptr; + }; + +} /* namespace gui */ diff --git a/module-apps/application-desktop/windows/DesktopMainWindow.cpp b/module-apps/application-desktop/windows/DesktopMainWindow.cpp index adc33398a..8f89df1de 100644 --- a/module-apps/application-desktop/windows/DesktopMainWindow.cpp +++ b/module-apps/application-desktop/windows/DesktopMainWindow.cpp @@ -35,8 +35,6 @@ namespace gui AppWindow::buildInterface(); bottomBar->setActive(BottomBar::Side::CENTER, true); - topBar->setActive( - {{TopBar::Elements::SIGNAL, true}, {TopBar::Elements::LOCK, true}, {TopBar::Elements::BATTERY, true}}); using namespace style::desktop; @@ -75,6 +73,20 @@ namespace gui notifications = nullptr; } + top_bar::Configuration DesktopMainWindow::configureTopBar(top_bar::Configuration appConfiguration) + { + auto app = getAppDesktop(); + const auto isLocked = app->lockHandler.isScreenLocked(); + updateTopBarConfiguration(isLocked, appConfiguration); + return appConfiguration; + } + + void DesktopMainWindow::updateTopBarConfiguration(bool isScreenLocked, top_bar::Configuration &configuration) + { + configuration.set(top_bar::Indicator::Lock, isScreenLocked); + configuration.set(top_bar::Indicator::Time, !isScreenLocked); + } + DesktopMainWindow::DesktopMainWindow(app::Application *app) : AppWindow(app, app::window::name::desktop_main_window) { buildInterface(); @@ -89,13 +101,18 @@ namespace gui void DesktopMainWindow::setVisibleState() { auto app = getAppDesktop(); + applyToTopBar([isLocked = app->lockHandler.isScreenLocked()](top_bar::Configuration configuration) { + updateTopBarConfiguration(isLocked, configuration); + return configuration; + }); + if (app->lockHandler.isScreenLocked()) { bottomBar->setText(BottomBar::Side::CENTER, utils::localize.get("app_desktop_unlock")); bottomBar->setActive(BottomBar::Side::RIGHT, false); bottomBar->setText(BottomBar::Side::LEFT, utils::localize.get("app_desktop_emergency"), app->lockHandler.isScreenBlocked()); - topBar->setActive(TopBar::Elements::LOCK, true); + inputCallback = nullptr; setFocusItem(nullptr); buildNotifications(app); @@ -104,8 +121,6 @@ namespace gui std::make_shared(), service::name::service_time, application); } else { - topBar->setActive(TopBar::Elements::LOCK, false); - if (!buildNotifications(app)) { LOG_ERROR("Couldn't fit in all notifications"); } @@ -146,7 +161,6 @@ namespace gui if (inputEvent.is(KeyCode::KEY_PND)) { app->lockHandler.lockScreen(); setVisibleState(); - application->setSuspendFlag(true); return true; } // long press of '0' key is translated to '+' diff --git a/module-apps/application-desktop/windows/DesktopMainWindow.hpp b/module-apps/application-desktop/windows/DesktopMainWindow.hpp index 8c5bf85a0..1b87c8ca8 100644 --- a/module-apps/application-desktop/windows/DesktopMainWindow.hpp +++ b/module-apps/application-desktop/windows/DesktopMainWindow.hpp @@ -81,11 +81,14 @@ namespace gui void rebuild() override; void buildInterface() override; void destroyInterface() override; + top_bar::Configuration configureTopBar(top_bar::Configuration appConfiguration) override; + bool updateTime(const UTF8 &timeStr) override; bool updateTime(const uint32_t ×tamp, bool mode24H) override; private: void invalidate() noexcept; + static void updateTopBarConfiguration(bool isScreenLocked, top_bar::Configuration &configuration); gui::KeyInputMappedTranslation translator; }; diff --git a/module-apps/application-desktop/windows/LockWindow.cpp b/module-apps/application-desktop/windows/LockWindow.cpp index e3d6f6b09..822d8f0c8 100644 --- a/module-apps/application-desktop/windows/LockWindow.cpp +++ b/module-apps/application-desktop/windows/LockWindow.cpp @@ -14,7 +14,6 @@ namespace gui void LockWindow::build() { buildBottomBar(); - buildTopBar(); buildTitleBar(); buildInfoTexts(); } diff --git a/module-apps/application-desktop/windows/LockWindow.hpp b/module-apps/application-desktop/windows/LockWindow.hpp index 019afd961..13cf7168e 100644 --- a/module-apps/application-desktop/windows/LockWindow.hpp +++ b/module-apps/application-desktop/windows/LockWindow.hpp @@ -58,7 +58,6 @@ namespace gui protected: virtual void buildBottomBar(); virtual void buildTitleBar() = 0; - virtual void buildTopBar() = 0; private: [[nodiscard]] auto getText(TextType type) noexcept -> gui::Text *; diff --git a/module-apps/application-desktop/windows/LockedInfoWindow.cpp b/module-apps/application-desktop/windows/LockedInfoWindow.cpp index b8e676a2d..0227a3817 100644 --- a/module-apps/application-desktop/windows/LockedInfoWindow.cpp +++ b/module-apps/application-desktop/windows/LockedInfoWindow.cpp @@ -34,10 +34,6 @@ void LockedInfoWindow::setVisibleState() bottomBar->setActive(BottomBar::Side::LEFT, true); bottomBar->setActive(BottomBar::Side::CENTER, false); bottomBar->setActive(BottomBar::Side::RIGHT, true); - - topBar->setActive(TopBar::Elements::LOCK, true); - topBar->setActive(TopBar::Elements::BATTERY, true); - topBar->setActive(TopBar::Elements::SIGNAL, true); } bool LockedInfoWindow::onInput(const InputEvent &inputEvent) @@ -61,6 +57,13 @@ void LockedInfoWindow::rebuild() buildInterface(); } +top_bar::Configuration LockedInfoWindow::configureTopBar(top_bar::Configuration appConfiguration) +{ + appConfiguration.enable(top_bar::Indicator::Lock); + appConfiguration.disable(top_bar::Indicator::Time); + return appConfiguration; +} + void LockedInfoWindow::buildInterface() { namespace lock_style = style::window::pin_lock; diff --git a/module-apps/application-desktop/windows/LockedInfoWindow.hpp b/module-apps/application-desktop/windows/LockedInfoWindow.hpp index 6531f008b..3d168a50f 100644 --- a/module-apps/application-desktop/windows/LockedInfoWindow.hpp +++ b/module-apps/application-desktop/windows/LockedInfoWindow.hpp @@ -25,5 +25,6 @@ namespace gui void rebuild() override; void buildInterface() override; void destroyInterface() override; + top_bar::Configuration configureTopBar(top_bar::Configuration appConfiguration) override; }; } /* namespace gui */ diff --git a/module-apps/application-desktop/windows/MenuWindow.cpp b/module-apps/application-desktop/windows/MenuWindow.cpp index f726cd81b..7d019d2f7 100644 --- a/module-apps/application-desktop/windows/MenuWindow.cpp +++ b/module-apps/application-desktop/windows/MenuWindow.cpp @@ -149,9 +149,6 @@ namespace gui bottomBar->setText(BottomBar::Side::CENTER, utils::localize.get(style::strings::common::open)); bottomBar->setText(BottomBar::Side::RIGHT, utils::localize.get(style::strings::common::back)); - topBar->setActive(TopBar::Elements::SIGNAL, true); - topBar->setActive(TopBar::Elements::BATTERY, true); - auto app = dynamic_cast(application); assert(app); diff --git a/module-apps/application-desktop/windows/MmiPullWindow.cpp b/module-apps/application-desktop/windows/MmiPullWindow.cpp index fb4641e69..092276040 100644 --- a/module-apps/application-desktop/windows/MmiPullWindow.cpp +++ b/module-apps/application-desktop/windows/MmiPullWindow.cpp @@ -37,8 +37,6 @@ MmiPullWindow::MmiPullWindow(app::Application *app, const std::string &name) : g { AppWindow::buildInterface(); - topBar->setActive(TopBar::Elements::TIME, true); - topBar->setActive(TopBar::Elements::SIM, false); bottomBar->setText(BottomBar::Side::CENTER, utils::localize.get("app_desktop_replay")); bottomBar->setText(BottomBar::Side::RIGHT, utils::localize.get(style::strings::common::back)); text = new Text( diff --git a/module-apps/application-desktop/windows/MmiPushWindow.cpp b/module-apps/application-desktop/windows/MmiPushWindow.cpp index 591f6059a..27b097745 100644 --- a/module-apps/application-desktop/windows/MmiPushWindow.cpp +++ b/module-apps/application-desktop/windows/MmiPushWindow.cpp @@ -30,8 +30,6 @@ namespace style::desktop MmiPushWindow::MmiPushWindow(app::Application *app, const std::string &name) : gui::AppWindow(app, name) { AppWindow::buildInterface(); - topBar->setActive(TopBar::Elements::TIME, true); - topBar->setActive(TopBar::Elements::SIM, false); bottomBar->setText(BottomBar::Side::CENTER, utils::localize.get(style::strings::common::ok)); icon = new Image(this, style::desktop::image::x, style::desktop::image::y, ""); icon->set("info_big_circle_W_G"); diff --git a/module-apps/application-desktop/windows/Names.hpp b/module-apps/application-desktop/windows/Names.hpp index 7c7bf4c29..bb9887f4a 100644 --- a/module-apps/application-desktop/windows/Names.hpp +++ b/module-apps/application-desktop/windows/Names.hpp @@ -7,13 +7,14 @@ namespace app::window::name { inline constexpr auto desktop_main_window = gui::name::window::main_window; - inline constexpr auto desktop_menu = "MenuWindow"; - inline constexpr auto desktop_reboot = "Reboot"; - inline constexpr auto desktop_poweroff = "PowerOffWindow"; - inline constexpr auto desktop_pin_lock = "PinLockWindow"; - inline constexpr auto desktop_locked = "LockedInfoWindow"; - inline constexpr auto desktop_update = "Update"; - inline constexpr auto desktop_mmi_pull = "MmiPullWindow"; - inline constexpr auto desktop_mmi_push = "MmiPushWindow"; + inline constexpr auto desktop_menu = "MenuWindow"; + inline constexpr auto desktop_reboot = "Reboot"; + inline constexpr auto desktop_poweroff = "PowerOffWindow"; + inline constexpr auto dead_battery = "DeadBatteryWindow"; + inline constexpr auto desktop_pin_lock = "PinLockWindow"; + inline constexpr auto desktop_locked = "LockedInfoWindow"; + inline constexpr auto desktop_update = "Update"; + inline constexpr auto desktop_mmi_pull = "MmiPullWindow"; + inline constexpr auto desktop_mmi_push = "MmiPushWindow"; inline constexpr auto desktop_mmi_internal = "MmiInternalMsgWindow"; }; // namespace app::window::name diff --git a/module-apps/application-desktop/windows/PinLockBaseWindow.cpp b/module-apps/application-desktop/windows/PinLockBaseWindow.cpp index c01bbac45..78adfc0fd 100644 --- a/module-apps/application-desktop/windows/PinLockBaseWindow.cpp +++ b/module-apps/application-desktop/windows/PinLockBaseWindow.cpp @@ -32,7 +32,12 @@ namespace gui } return std::string{}; } - + top_bar::Configuration PinLockBaseWindow::configureTopBar(top_bar::Configuration appConfiguration) + { + appConfiguration.enable(top_bar::Indicator::Lock); + appConfiguration.disable(top_bar::Indicator::Time); + return appConfiguration; + } void PinLockBaseWindow::restore() noexcept { LockWindow::restore(); @@ -91,10 +96,4 @@ namespace gui title->setPenWidth(2); } - void PinLockBaseWindow::buildTopBar() - { - topBar->setActive(TopBar::Elements::SIGNAL, true); - topBar->setActive(TopBar::Elements::BATTERY, true); - topBar->setActive(TopBar::Elements::LOCK, true); - } } // namespace gui diff --git a/module-apps/application-desktop/windows/PinLockBaseWindow.hpp b/module-apps/application-desktop/windows/PinLockBaseWindow.hpp index ca40937fe..65d8036db 100644 --- a/module-apps/application-desktop/windows/PinLockBaseWindow.hpp +++ b/module-apps/application-desktop/windows/PinLockBaseWindow.hpp @@ -12,6 +12,9 @@ namespace gui public: PinLockBaseWindow(app::Application *app, std::string name) : LockWindow(app, name) {} + + top_bar::Configuration configureTopBar(top_bar::Configuration appConfiguration) override; + void buildImages(const std::string &lockImg, const std::string &infoImg); [[nodiscard]] auto getToken(Token token) const -> std::string; void restore() noexcept override; @@ -25,6 +28,5 @@ namespace gui private: void buildBottomBar() override; void buildTitleBar() override; - void buildTopBar() override; }; } // namespace gui diff --git a/module-apps/application-desktop/windows/PowerOffWindow.cpp b/module-apps/application-desktop/windows/PowerOffWindow.cpp index e69b63526..7643ac49a 100644 --- a/module-apps/application-desktop/windows/PowerOffWindow.cpp +++ b/module-apps/application-desktop/windows/PowerOffWindow.cpp @@ -4,7 +4,6 @@ #include "InputEvent.hpp" #include "gui/widgets/BottomBar.hpp" #include "gui/widgets/TopBar.hpp" -#include "GuiTimer.hpp" #include "log/log.hpp" // module-utils @@ -15,6 +14,7 @@ // services #include +#include #include "service-cellular/ServiceCellular.hpp" #include @@ -142,7 +142,7 @@ namespace gui infoLabel->setVisible(false); application->refreshWindow(RefreshModes::GUI_REFRESH_DEEP); - scheduleSystemShutdown(); + app::manager::Controller::sendAction(application, app::manager::actions::CloseSystem); return true; }; @@ -160,23 +160,6 @@ namespace gui }; } - // Temporary solution for shutting down the system. - // The former solution removed from service-gui during its refactor. - // To be reimplemented in SystemManager in upcoming commits. - void PowerOffWindow::scheduleSystemShutdown() - { - constexpr auto SystemShutdownDelayInMs = 500; - auto powerOffTimer = std::make_unique("PowerOffTimer", application); - powerOffTimer->setInterval(SystemShutdownDelayInMs); - timerCallback = [this](Item &, Timer &timer) { - detachTimer(timer); - sys::SystemManager::CloseSystem(application); - return true; - }; - powerOffTimer->start(); - application->connect(std::move(powerOffTimer), this); - } - void PowerOffWindow::destroyInterface() { erase(); diff --git a/module-apps/application-desktop/windows/PowerOffWindow.hpp b/module-apps/application-desktop/windows/PowerOffWindow.hpp index c9c9761d7..510bc1ad7 100644 --- a/module-apps/application-desktop/windows/PowerOffWindow.hpp +++ b/module-apps/application-desktop/windows/PowerOffWindow.hpp @@ -27,9 +27,6 @@ namespace gui gui::Image *powerImage = nullptr; gui::Image *powerDownImage = nullptr; State state = State::Return; - - void scheduleSystemShutdown(); - public: PowerOffWindow(app::Application *app); void onBeforeShow(ShowMode mode, SwitchData *data) override; diff --git a/module-apps/application-meditation/windows/MeditationListViewWindows.cpp b/module-apps/application-meditation/windows/MeditationListViewWindows.cpp index 6198ddd3e..92735e792 100644 --- a/module-apps/application-meditation/windows/MeditationListViewWindows.cpp +++ b/module-apps/application-meditation/windows/MeditationListViewWindows.cpp @@ -64,7 +64,6 @@ void MeditationOptionsWindow::buildInterface() MeditationListViewWindow::buildInterface(); setTitle(utils::localize.get("common_options")); bottomBar->setText(BottomBar::Side::CENTER, utils::localize.get(style::strings::common::Switch)); - topBar->setActive(TopBar::Elements::TIME, true); } PreparationTimeWindow::PreparationTimeWindow(app::Application *app) @@ -79,5 +78,4 @@ void PreparationTimeWindow::buildInterface() MeditationListViewWindow::buildInterface(); setTitle(utils::localize.get("app_meditation_preparation_time")); bottomBar->setText(BottomBar::Side::CENTER, utils::localize.get(style::strings::common::select)); - topBar->setActive(TopBar::Elements::TIME, true); } diff --git a/module-apps/application-meditation/windows/MeditationTimerWindow.cpp b/module-apps/application-meditation/windows/MeditationTimerWindow.cpp index 663e9cf62..62f3fe196 100644 --- a/module-apps/application-meditation/windows/MeditationTimerWindow.cpp +++ b/module-apps/application-meditation/windows/MeditationTimerWindow.cpp @@ -112,7 +112,11 @@ auto MeditationTimerWindow::onInput(const InputEvent &inputEvent) -> bool void MeditationTimerWindow::setWidgetVisible(bool tBar, bool bBar, bool counter) { - topBar->setActive(TopBar::Elements::TIME, tBar); + applyToTopBar([tBar](top_bar::Configuration configuration) { + configuration.set(top_bar::Indicator::Time, tBar); + return configuration; + }); + title->setVisible(tBar); bottomBar->setActive(BottomBar::Side::CENTER, bBar); bottomBar->setActive(BottomBar::Side::LEFT, bBar); diff --git a/module-apps/application-messages/windows/MessagesMainWindow.cpp b/module-apps/application-messages/windows/MessagesMainWindow.cpp index c0473a6fd..ebf4f807b 100644 --- a/module-apps/application-messages/windows/MessagesMainWindow.cpp +++ b/module-apps/application-messages/windows/MessagesMainWindow.cpp @@ -64,8 +64,6 @@ namespace gui bottomBar->setText(BottomBar::Side::CENTER, utils::localize.get(style::strings::common::open)); bottomBar->setText(BottomBar::Side::RIGHT, utils::localize.get(style::strings::common::back)); - topBar->setActive(TopBar::Elements::TIME, true); - setTitle(utils::localize.get("app_messages_title_main")); leftArrowImage = new gui::Image(this, 30, 62, 0, 0, "arrow_left"); diff --git a/module-apps/application-messages/windows/NewMessage.cpp b/module-apps/application-messages/windows/NewMessage.cpp index cf84e4ee1..73f4b3ea8 100644 --- a/module-apps/application-messages/windows/NewMessage.cpp +++ b/module-apps/application-messages/windows/NewMessage.cpp @@ -188,9 +188,6 @@ namespace gui bottomBar->setText(BottomBar::Side::LEFT, utils::localize.get(style::strings::common::options)); bottomBar->setText(BottomBar::Side::CENTER, utils::localize.get(style::strings::common::select)); bottomBar->setText(BottomBar::Side::RIGHT, utils::localize.get(style::strings::common::back)); - topBar->setActive(TopBar::Elements::BATTERY, false); - topBar->setActive(TopBar::Elements::SIM, false); - topBar->setActive(TopBar::Elements::SIGNAL, false); setTitle(utils::localize.get("sms_title_message")); diff --git a/module-apps/application-messages/windows/SMSTemplatesWindow.cpp b/module-apps/application-messages/windows/SMSTemplatesWindow.cpp index b0f7eb1ab..f9825bd23 100644 --- a/module-apps/application-messages/windows/SMSTemplatesWindow.cpp +++ b/module-apps/application-messages/windows/SMSTemplatesWindow.cpp @@ -44,8 +44,6 @@ namespace gui bottomBar->setText(BottomBar::Side::CENTER, utils::localize.get(style::strings::common::use)); bottomBar->setText(BottomBar::Side::RIGHT, utils::localize.get(style::strings::common::back)); - topBar->setActive(TopBar::Elements::TIME, true); - namespace style = style::messages::templates::list; list = new gui::ListView(this, style::x, style::y, style::w, style::h, smsTemplateModel); diff --git a/module-apps/application-messages/windows/SMSThreadViewWindow.cpp b/module-apps/application-messages/windows/SMSThreadViewWindow.cpp index 8a74e0154..a10708166 100644 --- a/module-apps/application-messages/windows/SMSThreadViewWindow.cpp +++ b/module-apps/application-messages/windows/SMSThreadViewWindow.cpp @@ -29,7 +29,6 @@ namespace gui { AppWindow::buildInterface(); setTitle(utils::localize.get("app_messages_title_main")); - topBar->setActive(TopBar::Elements::TIME, true); bottomBar->setText(BottomBar::Side::LEFT, utils::localize.get(style::strings::common::options)); bottomBar->setText(BottomBar::Side::RIGHT, utils::localize.get(style::strings::common::back)); diff --git a/module-apps/application-music-player/windows/MusicPlayerAllSongsWindow.cpp b/module-apps/application-music-player/windows/MusicPlayerAllSongsWindow.cpp index 7f5b841e8..bc19f7643 100644 --- a/module-apps/application-music-player/windows/MusicPlayerAllSongsWindow.cpp +++ b/module-apps/application-music-player/windows/MusicPlayerAllSongsWindow.cpp @@ -54,8 +54,6 @@ namespace gui bottomBar->setText(BottomBar::Side::CENTER, utils::localize.get("app_music_player_play")); bottomBar->setText(BottomBar::Side::RIGHT, utils::localize.get(style::strings::common::back)); - topBar->setActive(TopBar::Elements::TIME, true); - songsList = new gui::ListView(this, musicPlayerStyle::allSongsWindow::x, musicPlayerStyle::allSongsWindow::y, diff --git a/module-apps/application-music-player/windows/MusicPlayerEmptyWindow.cpp b/module-apps/application-music-player/windows/MusicPlayerEmptyWindow.cpp index ce24fc872..3a0765231 100644 --- a/module-apps/application-music-player/windows/MusicPlayerEmptyWindow.cpp +++ b/module-apps/application-music-player/windows/MusicPlayerEmptyWindow.cpp @@ -33,8 +33,6 @@ namespace gui bottomBar->setText(BottomBar::Side::LEFT, utils::localize.get("app_music_player_music_library")); bottomBar->setText(BottomBar::Side::RIGHT, utils::localize.get("app_music_player_quit")); - topBar->setActive(TopBar::Elements::TIME, true); - img = new gui::Image(this, noteImg::x, noteImg::y, "note"); text = new Text(this, infoText::x, infoText::y, infoText::w, infoText::h); diff --git a/module-apps/application-notes/windows/NoteEditWindow.cpp b/module-apps/application-notes/windows/NoteEditWindow.cpp index a21d5224f..db86a837f 100644 --- a/module-apps/application-notes/windows/NoteEditWindow.cpp +++ b/module-apps/application-notes/windows/NoteEditWindow.cpp @@ -85,8 +85,6 @@ namespace app::notes bottomBar->setActive(gui::BottomBar::Side::RIGHT, true); bottomBar->setText(gui::BottomBar::Side::RIGHT, utils::localize.get(::style::strings::common::back)); - topBar->setActive(gui::TopBar::Elements::TIME, true); - setFocusItem(edit); } diff --git a/module-apps/application-notes/windows/NoteMainWindow.cpp b/module-apps/application-notes/windows/NoteMainWindow.cpp index e615c938e..e34a951ea 100644 --- a/module-apps/application-notes/windows/NoteMainWindow.cpp +++ b/module-apps/application-notes/windows/NoteMainWindow.cpp @@ -54,7 +54,6 @@ namespace app::notes bottomBar->setText(gui::BottomBar::Side::CENTER, utils::localize.get(::style::strings::common::open)); bottomBar->setActive(gui::BottomBar::Side::RIGHT, true); bottomBar->setText(gui::BottomBar::Side::RIGHT, utils::localize.get(::style::strings::common::back)); - topBar->setActive(gui::TopBar::Elements::TIME, true); namespace windowStyle = app::notes::style::main_window; leftArrowImage = new gui::Image(this, diff --git a/module-apps/application-notes/windows/NotePreviewWindow.cpp b/module-apps/application-notes/windows/NotePreviewWindow.cpp index 2606c1b6f..b8cdd4d37 100644 --- a/module-apps/application-notes/windows/NotePreviewWindow.cpp +++ b/module-apps/application-notes/windows/NotePreviewWindow.cpp @@ -79,8 +79,6 @@ namespace app::notes bottomBar->setActive(gui::BottomBar::Side::RIGHT, true); bottomBar->setText(gui::BottomBar::Side::RIGHT, utils::localize.get(::style::strings::common::back)); - topBar->setActive(gui::TopBar::Elements::TIME, true); - setFocusItem(note); } diff --git a/module-apps/application-phonebook/windows/PhonebookContactDetails.cpp b/module-apps/application-phonebook/windows/PhonebookContactDetails.cpp index 4eee1b429..fd639b90f 100644 --- a/module-apps/application-phonebook/windows/PhonebookContactDetails.cpp +++ b/module-apps/application-phonebook/windows/PhonebookContactDetails.cpp @@ -25,7 +25,6 @@ namespace gui void PhonebookContactDetails::buildInterface() { AppWindow::buildInterface(); - topBar->setActive(TopBar::Elements::TIME, true); bottomBar->setText(BottomBar::Side::LEFT, utils::localize.get(style::strings::common::options)); bottomBar->setText(BottomBar::Side::RIGHT, utils::localize.get(style::strings::common::back)); diff --git a/module-apps/application-phonebook/windows/PhonebookIceContacts.cpp b/module-apps/application-phonebook/windows/PhonebookIceContacts.cpp index 24229956a..29422faae 100644 --- a/module-apps/application-phonebook/windows/PhonebookIceContacts.cpp +++ b/module-apps/application-phonebook/windows/PhonebookIceContacts.cpp @@ -25,7 +25,6 @@ namespace gui { AppWindow::buildInterface(); - topBar->setActive(TopBar::Elements::TIME, true); setTitle(utils::localize.get("app_phonebook_ice_contacts_title")); contactsListIce = new gui::ListView(this, diff --git a/module-apps/application-phonebook/windows/PhonebookMainWindow.cpp b/module-apps/application-phonebook/windows/PhonebookMainWindow.cpp index c63b22684..d4131b5b5 100644 --- a/module-apps/application-phonebook/windows/PhonebookMainWindow.cpp +++ b/module-apps/application-phonebook/windows/PhonebookMainWindow.cpp @@ -30,7 +30,6 @@ namespace gui { AppWindow::buildInterface(); - topBar->setActive(TopBar::Elements::TIME, true); setTitle(utils::localize.get("app_phonebook_title_main")); leftArrowImage = new gui::Image(this, phonebookStyle::mainWindow::leftArrowImage::x, diff --git a/module-apps/application-phonebook/windows/PhonebookSearch.cpp b/module-apps/application-phonebook/windows/PhonebookSearch.cpp index bcc296df4..9efc785e9 100644 --- a/module-apps/application-phonebook/windows/PhonebookSearch.cpp +++ b/module-apps/application-phonebook/windows/PhonebookSearch.cpp @@ -16,7 +16,6 @@ namespace gui void PhonebookSearch::buildInterface() { AppWindow::buildInterface(); - topBar->setActive(TopBar::Elements::TIME, true); setTitle(utils::localize.get("app_phonebook_title_main")); diff --git a/module-apps/application-phonebook/windows/PhonebookSearchResults.cpp b/module-apps/application-phonebook/windows/PhonebookSearchResults.cpp index 6b93f7756..2f0d6c872 100644 --- a/module-apps/application-phonebook/windows/PhonebookSearchResults.cpp +++ b/module-apps/application-phonebook/windows/PhonebookSearchResults.cpp @@ -40,8 +40,6 @@ namespace gui bottomBar->setActive(BottomBar::Side::RIGHT, true); bottomBar->setText(BottomBar::Side::RIGHT, utils::localize.get(style::strings::common::back)); - topBar->setActive(TopBar::Elements::TIME, true); - setTitle(utils::localize.get("common_results_prefix")); } diff --git a/module-apps/application-settings-new/ApplicationSettings.cpp b/module-apps/application-settings-new/ApplicationSettings.cpp index a0104201f..1607cf063 100644 --- a/module-apps/application-settings-new/ApplicationSettings.cpp +++ b/module-apps/application-settings-new/ApplicationSettings.cpp @@ -5,7 +5,8 @@ #include "windows/AddDeviceWindow.hpp" #include "windows/AllDevicesWindow.hpp" -#include "windows/APNSettingsWindow.hpp" +#include "windows/ApnSettingsWindow.hpp" +#include "windows/ApnOptionsWindow.hpp" #include "windows/BluetoothWindow.hpp" #include "windows/SettingsMainWindow.hpp" #include "windows/DisplayAndKeypadWindow.hpp" @@ -28,6 +29,7 @@ #include "windows/QuotesOptionsWindow.hpp" #include "windows/ChangePasscodeWindow.hpp" #include "windows/SystemMainWindow.hpp" +#include "windows/NewApnWindow.hpp" #include "Dialog.hpp" @@ -37,9 +39,9 @@ #include #include #include -#include -#include #include +#include +#include #include #include #include @@ -66,17 +68,10 @@ namespace app Store::GSM::get()->sim == selectedSim) { selectedSimNumber = CellularServiceAPI::GetOwnNumber(this); } - settings->registerValueChange(settings::operators_on, - [this](const std::string &value) { operatorOnChanged(value); }); - - settings->registerValueChange(::settings::Cellular::volte_on, - [this](const std::string &value) { volteChanged(value); }); } ApplicationSettingsNew::~ApplicationSettingsNew() { - settings->unregisterValueChange(settings::operators_on); - settings->unregisterValueChange(::settings::Cellular::volte_on); } // Invoked upon receiving data message @@ -152,13 +147,29 @@ namespace app return sys::MessageNone{}; }); + connect(typeid(CellularGetAPNResponse), [&](sys::Message *msg) { + if (gui::window::name::apn_settings == getCurrentWindow()->getName()) { + auto apns = dynamic_cast(msg); + if (apns != nullptr) { + auto apnsData = std::make_unique(apns->getAPNs()); + switchWindow(gui::window::name::apn_settings, std::move(apnsData)); + } + } + return sys::MessageNone{}; + }); + createUserInterface(); setActiveWindow(gui::name::window::main_window); - settings->registerValueChange(::settings::SystemProperties::lockPassHash, [this](std::string value) { - lockPassHash = utils::getNumericValue(value); - }); + settings->registerValueChange(settings::operators_on, + [this](const std::string &value) { operatorOnChanged(value); }); + settings->registerValueChange(::settings::Cellular::volte_on, + [this](const std::string &value) { volteChanged(value); }); + settings->registerValueChange( + ::settings::SystemProperties::lockPassHash, + [this](std::string value) { lockPassHash = utils::getNumericValue(value); }, + ::settings::SettingsScope::Global); return ret; } @@ -210,7 +221,10 @@ namespace app app, static_cast(app), static_cast(app)); }); windowsFactory.attach(gui::window::name::apn_settings, [](Application *app, const std::string &name) { - return std::make_unique(app); + return std::make_unique(app); + }); + windowsFactory.attach(gui::window::name::apn_options, [](Application *app, const std::string &name) { + return std::make_unique(app); }); windowsFactory.attach(gui::window::name::messages, [](Application *app, const std::string &name) { return std::make_unique(app); @@ -233,9 +247,18 @@ namespace app windowsFactory.attach(gui::window::name::security, [](Application *app, const std::string &name) { return std::make_unique(app); }); + windowsFactory.attach(gui::window::name::change_passcode, [](Application *app, const std::string &name) { + return std::make_unique(app); + }); + windowsFactory.attach(gui::window::name::dialog_confirm, [](Application *app, const std::string &name) { + return std::make_unique(app, gui::window::name::dialog_confirm); + }); windowsFactory.attach(gui::window::name::system, [](Application *app, const std::string &name) { return std::make_unique(app); }); + windowsFactory.attach(gui::window::name::new_apn, [](Application *app, const std::string &name) { + return std::make_unique(app); + }); } void ApplicationSettingsNew::destroyUserInterface() @@ -258,17 +281,20 @@ namespace app void ApplicationSettingsNew::operatorOnChanged(const std::string &value) { + LOG_DEBUG("[ApplicationSettingsNew::operatorOnChanged] value=%s", value.c_str()); if (!value.empty()) { operatorsOn = utils::getNumericValue(value); } } bool ApplicationSettingsNew::getOperatorsOn() const noexcept { + LOG_DEBUG("[ApplicationSettingsNew::getOperatorsOn] %d", operatorsOn); return operatorsOn; } void ApplicationSettingsNew::setOperatorsOn(bool value) { operatorsOn = value; + LOG_DEBUG("[ApplicationSettingsNew::setOperatorsOn] to %d", operatorsOn); settings->setValue(settings::operators_on, std::to_string(value)); } @@ -293,7 +319,8 @@ namespace app void ApplicationSettingsNew::setLockPassHash(unsigned int value) { lockPassHash = value; - settings->setValue(::settings::SystemProperties::lockPassHash, std::to_string(value)); + settings->setValue( + ::settings::SystemProperties::lockPassHash, std::to_string(value), ::settings::SettingsScope::Global); } auto ApplicationSettingsNew::getCurrentValues() -> settingsInterface::ScreenLightSettings::Values diff --git a/module-apps/application-settings-new/ApplicationSettings.hpp b/module-apps/application-settings-new/ApplicationSettings.hpp index 28edc2c3a..03b97c39c 100644 --- a/module-apps/application-settings-new/ApplicationSettings.hpp +++ b/module-apps/application-settings-new/ApplicationSettings.hpp @@ -17,6 +17,7 @@ namespace gui::window::name inline constexpr auto network = "Network"; inline constexpr auto apn_settings = "APNSettings"; + inline constexpr auto apn_options = "APNOptions"; inline constexpr auto phone_modes = "PhoneModes"; inline constexpr auto apps_and_tools = "AppsAndTools"; inline constexpr auto security = "Security"; @@ -55,6 +56,8 @@ namespace gui::window::name inline constexpr auto about_your_pure = "AboutYourPure"; inline constexpr auto certification = "Certification"; + inline constexpr auto new_apn = "NewApn"; + } // namespace gui::window::name namespace app diff --git a/module-apps/application-settings-new/CMakeLists.txt b/module-apps/application-settings-new/CMakeLists.txt index d29668f3a..567aceec8 100644 --- a/module-apps/application-settings-new/CMakeLists.txt +++ b/module-apps/application-settings-new/CMakeLists.txt @@ -15,13 +15,17 @@ target_sources( ${PROJECT_NAME} PRIVATE ApplicationSettings.cpp + models/ApnSettingsModel.cpp + models/NewApnModel.cpp widgets/timeWidget.cpp widgets/ChangePasscodeLockHandler.cpp widgets/QuoteWidget.cpp + widgets/ApnInputWidget.cpp windows/SettingsMainWindow.cpp windows/AddDeviceWindow.cpp windows/AllDevicesWindow.cpp - windows/APNSettingsWindow.cpp + windows/ApnSettingsWindow.cpp + windows/ApnOptionsWindow.cpp windows/BaseSettingsWindow.cpp windows/BluetoothWindow.cpp windows/FontSizeWindow.cpp @@ -42,12 +46,16 @@ target_sources( ${PROJECT_NAME} windows/QuotesAddWindow.cpp windows/SecurityMainWindow.cpp windows/ChangePasscodeWindow.cpp + windows/NewApnWindow.cpp widgets/SpinBox.cpp widgets/SpinBoxOptionSetting.cpp windows/SystemMainWindow.cpp PUBLIC ApplicationSettings.hpp + widgets/ChangePasscodeLockHandler.hpp + widgets/ApnInputWidget.hpp + windows/NewApnWindow.hpp windows/SettingsMainWindow.hpp windows/BaseSettingsWindow.hpp windows/FontSizeWindow.hpp @@ -61,6 +69,7 @@ target_sources( ${PROJECT_NAME} widgets/SettingsStyle.hpp windows/AutolockWindow.hpp windows/WallpaperWindow.hpp + windows/ChangePasscodeWindow.hpp windows/SystemMainWindow.hpp ) diff --git a/module-apps/application-settings-new/data/ApnListData.hpp b/module-apps/application-settings-new/data/ApnListData.hpp new file mode 100644 index 000000000..4ae571db3 --- /dev/null +++ b/module-apps/application-settings-new/data/ApnListData.hpp @@ -0,0 +1,27 @@ +// 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 +#include + +#include + +namespace gui +{ + + class ApnListData : public SwitchData + { + public: + explicit ApnListData(std::vector> apns) : apns(std::move(apns)) + {} + [[nodiscard]] auto getAPNs() const noexcept -> const std::vector> & + { + return apns; + } + + private: + std::vector> apns; + }; +} // namespace gui diff --git a/module-apps/application-settings-new/data/QuoteSwitchData.hpp b/module-apps/application-settings-new/data/QuoteSwitchData.hpp index 8a6b9dcc4..39144ff4e 100644 --- a/module-apps/application-settings-new/data/QuoteSwitchData.hpp +++ b/module-apps/application-settings-new/data/QuoteSwitchData.hpp @@ -3,9 +3,9 @@ #pragma once -#include "application-settings-new/model/QuotesModel.hpp" +#include "application-settings-new/models/QuotesModel.hpp" -#include +#include #include #include diff --git a/module-apps/application-settings-new/data/SettingsInternals.hpp b/module-apps/application-settings-new/data/SettingsInternals.hpp new file mode 100644 index 000000000..fca5eb5e1 --- /dev/null +++ b/module-apps/application-settings-new/data/SettingsInternals.hpp @@ -0,0 +1,30 @@ +// 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 + +namespace settingsInternals +{ + enum class ListItemName + { + Name, + APN, + Proxy, + Port, + Username, + Password, + + Server, + MMSC, + MmsProxy, + MmsPort, + MCC, + MNC, + AuthType, + ApnType, + ApnProtocol + }; + +} // namespace settingsInternals diff --git a/module-apps/application-settings-new/data/SettingsItemData.hpp b/module-apps/application-settings-new/data/SettingsItemData.hpp new file mode 100644 index 000000000..d9ad73e2b --- /dev/null +++ b/module-apps/application-settings-new/data/SettingsItemData.hpp @@ -0,0 +1,23 @@ +// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. +// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md + +#pragma once + +#include +#include +#include + +class ApnItemData : public gui::SwitchData +{ + public: + ApnItemData(std::shared_ptr Apn) : apn(std::move(Apn)){}; + ApnItemData() : apn(nullptr){}; + + auto getApn() -> std::shared_ptr + { + return apn; + } + + private: + std::shared_ptr apn; +}; diff --git a/module-apps/application-settings-new/models/ApnSettingsModel.cpp b/module-apps/application-settings-new/models/ApnSettingsModel.cpp new file mode 100644 index 000000000..bf4f821f1 --- /dev/null +++ b/module-apps/application-settings-new/models/ApnSettingsModel.cpp @@ -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 + +#include "ApnSettingsModel.hpp" +#include +#include + +ApnSettingsModel::ApnSettingsModel(app::Application *application) : application{application} +{} + +void ApnSettingsModel::requestAPNList() +{ + sys::Bus::SendUnicast(std::make_shared(), ServiceCellular::serviceName, application); +} + +void ApnSettingsModel::saveAPN(std::shared_ptr apn) +{ + sys::Bus::SendUnicast(std::make_shared(apn), ServiceCellular::serviceName, application); +} + +void ApnSettingsModel::removeAPN(std::shared_ptr apn) +{} + +void ApnSettingsModel::setAsDefaultAPN(std::shared_ptr apn) +{ + apn->apnType = packet_data::APN::APNType::Default; + sys::Bus::SendUnicast(std::make_shared(apn), ServiceCellular::serviceName, application); +} diff --git a/module-apps/application-settings-new/models/ApnSettingsModel.hpp b/module-apps/application-settings-new/models/ApnSettingsModel.hpp new file mode 100644 index 000000000..63addc3a1 --- /dev/null +++ b/module-apps/application-settings-new/models/ApnSettingsModel.hpp @@ -0,0 +1,21 @@ +// 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 +#include + +class ApnSettingsModel +{ + public: + ApnSettingsModel(app::Application *application); + + void requestAPNList(); + void saveAPN(std::shared_ptr apn); + void removeAPN(std::shared_ptr apn); + void setAsDefaultAPN(std::shared_ptr apn); + + private: + app::Application *application = nullptr; +}; diff --git a/module-apps/application-settings-new/models/NewApnModel.cpp b/module-apps/application-settings-new/models/NewApnModel.cpp new file mode 100644 index 000000000..80922c1e1 --- /dev/null +++ b/module-apps/application-settings-new/models/NewApnModel.cpp @@ -0,0 +1,133 @@ +// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. +// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md + +#include "NewApnModel.hpp" + +#include "application-settings-new/widgets/ApnInputWidget.hpp" + +#include +#include