blob: fde4fe372913dad0e2e19622555d8015c95c51c0 [file] [log] [blame]
// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "src/ui/a11y/bin/a11y_manager/app.h"
#include <lib/syslog/cpp/logger.h>
#include <zircon/status.h>
namespace a11y_manager {
const float kDefaultMagnificationZoomFactor = 1.0;
App::App(std::unique_ptr<sys::ComponentContext> context)
: startup_context_(std::move(context)),
settings_manager_impl_(std::make_unique<a11y::SettingsManagerImpl>()),
semantics_manager_impl_(std::make_unique<a11y::SemanticsManagerImpl>()) {
Initialize();
}
void App::Initialize() {
// Add Settings Manager service.
startup_context_->outgoing()->AddPublicService<fuchsia::accessibility::SettingsManager>(
[this](fidl::InterfaceRequest<fuchsia::accessibility::SettingsManager> request) {
settings_manager_impl_->AddBinding(std::move(request));
});
// Add Semantics Manager service.
semantics_manager_impl_->SetDebugDirectory(startup_context_->outgoing()->debug_dir());
startup_context_->outgoing()
->AddPublicService<fuchsia::accessibility::semantics::SemanticsManager>(
[this](
fidl::InterfaceRequest<fuchsia::accessibility::semantics::SemanticsManager> request) {
semantics_manager_impl_->AddBinding(std::move(request));
});
// Connect to Settings manager service and register a watcher.
settings_manager_impl_->AddBinding(settings_manager_.NewRequest());
settings_manager_.set_error_handler([](zx_status_t status) {
FXL_LOG(ERROR) << "Cannot connect to SettingsManager with status:"
<< zx_status_get_string(status);
});
fidl::InterfaceHandle<fuchsia::accessibility::SettingsWatcher> watcher_handle;
settings_watcher_bindings_.AddBinding(this, watcher_handle.NewRequest());
settings_manager_->Watch(std::move(watcher_handle));
}
fuchsia::accessibility::SettingsPtr App::GetSettings() {
auto settings_ptr = fuchsia::accessibility::Settings::New();
settings_.Clone(settings_ptr.get());
return settings_ptr;
}
void App::SetSettings(fuchsia::accessibility::Settings provided_settings) {
settings_.set_magnification_enabled(provided_settings.has_magnification_enabled() &&
provided_settings.magnification_enabled());
if (provided_settings.has_magnification_zoom_factor()) {
settings_.set_magnification_zoom_factor(provided_settings.magnification_zoom_factor());
} else {
settings_.set_magnification_zoom_factor(kDefaultMagnificationZoomFactor);
}
settings_.set_screen_reader_enabled(provided_settings.has_screen_reader_enabled() &&
provided_settings.screen_reader_enabled());
settings_.set_color_inversion_enabled(provided_settings.has_color_inversion_enabled() &&
provided_settings.color_inversion_enabled());
if (provided_settings.has_color_correction()) {
settings_.set_color_correction(provided_settings.color_correction());
} else {
settings_.set_color_correction(fuchsia::accessibility::ColorCorrection::DISABLED);
}
if (provided_settings.has_color_adjustment_matrix()) {
settings_.set_color_adjustment_matrix(provided_settings.color_adjustment_matrix());
}
}
void App::OnScreenReaderEnabled(bool enabled) {
// Reset SemanticsTree and registered views in SemanticsManagerImpl.
semantics_manager_impl_->SetSemanticsManagerEnabled(enabled);
// Reset ScreenReader.
if (enabled) {
screen_reader_ = std::make_unique<a11y::ScreenReader>();
} else {
screen_reader_.reset();
}
}
void App::OnSettingsChange(fuchsia::accessibility::Settings provided_settings) {
// Check if screen reader settings have changed.
if ((settings_.has_screen_reader_enabled() && settings_.screen_reader_enabled()) !=
(provided_settings.has_screen_reader_enabled() &&
provided_settings.screen_reader_enabled())) {
OnScreenReaderEnabled(provided_settings.screen_reader_enabled());
}
// Set A11y Settings.
SetSettings(std::move(provided_settings));
}
} // namespace a11y_manager