// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #include "PhoneLockedWindow.hpp" #include "PhoneLockedInfoData.hpp" #include #include namespace gui { PhoneLockedWindow::PhoneLockedWindow(app::ApplicationCommon *app, const std::string &name) : AppWindow(app, name), notificationsModel(std::make_shared(NotificationsListPlacement::LockedScreen)) { buildInterface(); preBuildDrawListHook = [this](std::list &cmd) { updateTime(); }; } void PhoneLockedWindow::buildInterface() { AppWindow::buildInterface(); clockDate = new ClockDateWidget( this, 0, style::window::default_vertical_pos, style::window_width, clock_date_widget::h); notificationsList = new ListView(this, style::notifications::model::x, style::notifications::model::y, style::notifications::model::w, style::notifications::model::h, notificationsModel, listview::ScrollBarType::None); } status_bar::Configuration PhoneLockedWindow::configureStatusBar(status_bar::Configuration appConfiguration) { appConfiguration.disable(status_bar::Indicator::NetworkAccessTechnology); appConfiguration.disable(status_bar::Indicator::Time); appConfiguration.enable(status_bar::Indicator::PhoneMode); appConfiguration.enable(status_bar::Indicator::Lock); appConfiguration.enable(status_bar::Indicator::Battery); appConfiguration.enable(status_bar::Indicator::Signal); appConfiguration.enable(status_bar::Indicator::SimCard); appConfiguration.enable(status_bar::Indicator::Bluetooth); appConfiguration.enable(status_bar::Indicator::AlarmClock); return appConfiguration; } void PhoneLockedWindow::onBeforeShow(ShowMode mode, SwitchData *data) { auto notificationData = dynamic_cast(data); if (notificationData) { notificationsModel->updateData(notificationData); } else if (!notificationsModel->isPhoneTimeLock()) { app::manager::Controller::requestNotifications(application); navBar->setActive(nav_bar::Side::Left, false); navBar->setActive(nav_bar::Side::Center, false); navBar->setActive(nav_bar::Side::Right, false); return; } if (notificationsModel->isPhoneTimeLock()) { if (!refreshedOnPhoneLockTimeLock) { application->refreshWindow(RefreshModes::GUI_REFRESH_DEEP); refreshedOnPhoneLockTimeLock = true; } navBar->setText(nav_bar::Side::Left, utils::translate("app_desktop_emergency")); navBar->setActive(nav_bar::Side::Center, false); navBar->setActive(nav_bar::Side::Right, false); } else { navBar->setActive(nav_bar::Side::Left, false); navBar->setText(nav_bar::Side::Center, utils::translate("app_desktop_unlock")); navBar->setActive(nav_bar::Side::Right, false); } } bool PhoneLockedWindow::processLongReleaseEvent(const InputEvent &inputEvent) { if (inputEvent.is(KeyCode::KEY_RF)) { application->switchWindow(gui::popup::window::power_off_window); } return true; } bool PhoneLockedWindow::onInput(const InputEvent &inputEvent) { // check if any of the lower inheritance onInput methods catch the event if (locks::PhoneLockedKeysWhitelist::isOnWhitelist(inputEvent)) { return AppWindow::onInput(inputEvent); } if (inputEvent.isLongRelease()) { return processLongReleaseEvent(inputEvent); } else if (inputEvent.isShortRelease() && navBar->isActive(nav_bar::Side::Center)) { const auto requiredStage = (inputEvent.is(KeyCode::KEY_ENTER)) ? PhoneLockedInfoData::Stage::Waiting : PhoneLockedInfoData::Stage::Idle; application->switchWindow(gui::popup::window::phone_lock_info_window, std::make_unique(requiredStage)); return true; } else if (inputEvent.isShortRelease(KeyCode::KEY_LF) && navBar->isActive(nav_bar::Side::Left)) { app::manager::Controller::sendAction(application, app::manager::actions::EmergencyDial, std::make_unique(), app::manager::OnSwitchBehaviour::RunInBackground); } return true; } bool PhoneLockedWindow::updateTime() { auto ret = AppWindow::updateTime(); clockDate->setTime(std::time(nullptr)); return ret; } } /* namespace gui */