Files
MuditaOS/module-apps/application-settings-new/windows/AllDevicesWindow.cpp
Pawel Olejniczak e676068f62 [EGD-5912] Add forget bluetooth device feature
Added button on AllDevices window, and handling for it.
Added needed messages for communication with service bluetooth.
Feature is now complete on application settings side.
Further integration in service bluetooth is needed.
2021-03-01 10:11:24 +01:00

112 lines
5.0 KiB
C++

// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md
#include "AllDevicesWindow.hpp"
#include "application-settings-new/ApplicationSettings.hpp"
#include "application-settings-new/data/BondedDevicesData.hpp"
#include "application-settings-new/widgets/SettingsStyle.hpp"
#include "DialogMetadataMessage.hpp"
#include "OptionSetting.hpp"
#include <InputEvent.hpp>
namespace gui
{
AllDevicesWindow::AllDevicesWindow(app::Application *app) : BaseSettingsWindow(app, window::name::all_devices)
{
bluetoothSettingsModel = std::make_unique<BluetoothSettingsModel>(application);
bluetoothSettingsModel->requestBondedDevices();
buildInterface();
}
void AllDevicesWindow::buildInterface()
{
setTitle(utils::localize.get("app_settings_bluetooth_all_devices"));
leftArrowImage = new gui::Image(this,
style::settings::window::leftArrowImage::x,
style::settings::window::leftArrowImage::y,
style::settings::window::leftArrowImage::w,
style::settings::window::leftArrowImage::h,
"arrow_left");
crossImage = new gui::Image(this,
style::settings::window::crossImage::x,
style::settings::window::crossImage::y,
style::settings::window::crossImage::w,
style::settings::window::crossImage::h,
"cross");
}
void AllDevicesWindow::onBeforeShow(ShowMode /*mode*/, SwitchData *data)
{
const auto newData = dynamic_cast<BondedDevicesData *>(data);
if (newData != nullptr) {
devices = newData->getDevices();
addressOfConnectedDevice = newData->getAddressOfConnectedDevice();
}
refreshOptionsList();
}
auto AllDevicesWindow::onInput(const InputEvent &inputEvent) -> bool
{
if (!inputEvent.isShortPress()) {
return AppWindow::onInput(inputEvent);
}
if (inputEvent.is(KeyCode::KEY_LEFT)) {
bluetoothSettingsModel->requestScan();
application->switchWindow(gui::window::name::dialog_settings,
gui::ShowMode::GUI_SHOW_INIT,
std::make_unique<gui::DialogMetadataMessage>(gui::DialogMetadata{
utils::localize.get("app_settings_bluetooth_add_device"),
"search_big",
utils::localize.get("app_settings_bluetooth_searching_devices")}));
return true;
}
if (inputEvent.is(KeyCode::KEY_LF)) {
devices.erase(std::remove_if(devices.begin(),
devices.end(),
[&](const auto &device) {
return (bd_addr_to_str(device.address) == addressOfSelectedDevice);
}),
devices.end());
refreshOptionsList();
bluetoothSettingsModel->requestDeviceUnpair(addressOfSelectedDevice);
return true;
}
return AppWindow::onInput(inputEvent);
}
auto AllDevicesWindow::buildOptionsList() -> std::list<Option>
{
std::list<gui::Option> optionsList;
for (const auto &device : devices) {
std::string addr{bd_addr_to_str(device.address)};
auto isConnected = addr == addressOfConnectedDevice;
optionsList.emplace_back(std::make_unique<gui::option::OptionSettings>(
device.name,
[=](gui::Item & /*item*/) {
LOG_DEBUG("Device: %s", device.name.c_str());
bluetoothSettingsModel->requestConnection(addr);
return true;
},
[=](gui::Item &item) {
if (item.focus) {
this->setBottomBarText(isConnected ? utils::translateI18("common_disconnect")
: utils::translateI18("common_connect"),
BottomBar::Side::CENTER);
this->setBottomBarText(utils::translateI18("common_forget"), BottomBar::Side::LEFT);
this->bottomBar->setActive(BottomBar::Side::LEFT, true);
addressOfSelectedDevice = addr;
}
return true;
},
nullptr,
isConnected ? gui::option::SettingRightItem::Text : gui::option::SettingRightItem::Bt,
false,
utils::localize.get("app_settings_option_connected")));
}
return optionsList;
}
} // namespace gui