+++ /dev/null
-/*
- * Copyright 2018 Samsung Electronics Co., Ltd
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
-
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "ScreenReaderSettingsPage.hpp"
-
-#include "Box.hpp"
-#include "Button.hpp"
-#include "Genlist.hpp"
-#include "Layout.hpp"
-#include "Singleton.hpp"
-#include "Slider.hpp"
-#include "TextToSpeech.hpp"
-#include "VConf.hpp"
-#include "setting-accessibility.h"
-#include "utils.hpp"
-
-#include <app.h>
-#include <efl_extension.h>
-#include <vconf-internal-keys.h>
-#include <vconf.h>
-
-namespace
-{
- struct VConfCheckData
- {
- std::string label;
- std::string vconf_key;
- bool state = false;
- };
-
- std::vector<VConfCheckData> vConfCheckData = {{"IDS_ST_HEADER_TIME", VCONFKEY_SETAPPL_ACCESSIBILITY_TTS_INDICATOR_INFORMATION_TIME},
- {"IDS_ST_BODY_DATE", VCONFKEY_SETAPPL_ACCESSIBILITY_TTS_INDICATOR_INFORMATION_DATE},
- {"IDS_ST_BODY_BATTERY", VCONFKEY_SETAPPL_ACCESSIBILITY_TTS_INDICATOR_INFORMATION_BATTERY},
- {"IDS_ST_BODY_SIGNAL_STRENGTH", VCONFKEY_SETAPPL_ACCESSIBILITY_TTS_INDICATOR_INFORMATION_SIGNAL_STRENGHT},
- {"IDS_ST_BODY_BLUETOOTH", VCONFKEY_SETAPPL_ACCESSIBILITY_TTS_INDICATOR_INFORMATION_BLUETOOTH},
- {"IDS_ST_BODY_MISSED_EVENTS", VCONFKEY_SETAPPL_ACCESSIBILITY_TTS_INDICATOR_INFORMATION_MISSED_EVENTS}};
-
- static const size_t POPUP_CONTENT_BASE_SIZE = 120;
-} // namespace
-
-ScreenReaderSettingsPage::ScreenReaderSettingsPage()
- : context_(Singleton<AppContext>::instance())
-{
- auto genlist = Widget::make<Genlist>(context_.navContext_.getNaviframe());
- genlist->setMode(ELM_LIST_COMPRESS);
- genlist->setStyle("dialogue");
- genlist->clear(); // TODO check if necessary
-
- DEBUG("Creating items");
-
- auto percentage = calculateSpeedPercentage();
- speechRateItem_ = genlist->appendItem({"type1", "IDS_ST_BODY_SPEECH_RATE", percentage, [this](auto item) { this->createSpeechRatePopup(); }});
-
- Singleton<TextToSpeech>::instance().addSpeedChangedCb([item = speechRateItem_](auto val) {
- DEBUG("Speed changed to (%d)", static_cast<int>(val));
- item->setDescription(std::to_string(val));
- });
-
- auto item = genlist->appendItem({"multiline",
- "IDS_ACCS_OPT_KEYBOARD_FEEDBACK_TTS",
- "IDS_ACCS_OPT_ALWAYS_READ_OUT_KEYBOARD_INPUT_TTS",
- [](auto item) {
- Singleton<VConfInterface>::instance().set(VCONFKEY_SETAPPL_ACCESSIBILITY_SCREEN_READER_KEYBOARD_FEEDBACK, item->getState());
- },
- GenlistItem::WidgetType::toggle});
- item->setState(Singleton<VConfInterface>::instance().get(VCONFKEY_SETAPPL_ACCESSIBILITY_SCREEN_READER_KEYBOARD_FEEDBACK, false));
-
- item = genlist->appendItem({"type1",
- "IDS_ACCS_MBODY_READ_OUT_USAGE_HINTS_ABB",
- {},
- [](auto item) {
- Singleton<VConfInterface>::instance().set(VCONFKEY_SETAPPL_ACCESSIBILITY_SCREEN_READER_DESCRIPTION, item->getState());
- },
- GenlistItem::WidgetType::toggle});
- item->setState(Singleton<VConfInterface>::instance().get(VCONFKEY_SETAPPL_ACCESSIBILITY_SCREEN_READER_DESCRIPTION, false));
-
- item = genlist->appendItem({"type1",
- "IDS_ACCS_MBODY_VIBRATION_FEEDBACK",
- {},
- [](auto item) {
- Singleton<VConfInterface>::instance().set(VCONFKEY_SETAPPL_ACCESSIBILITY_SCREEN_READER_HAPTIC, item->getState());
- },
- GenlistItem::WidgetType::toggle});
- item->setState(Singleton<VConfInterface>::instance().get(VCONFKEY_SETAPPL_ACCESSIBILITY_SCREEN_READER_HAPTIC, false));
-
- item = genlist->appendItem({"type1",
- "IDS_ACCS_MBODY_SOUND_FEEDBACK",
- {},
- [](auto item) {
- Singleton<VConfInterface>::instance().set(VCONFKEY_SETAPPL_ACCESSIBILITY_SCREEN_READER_SOUND_FEEDBACK, item->getState());
- },
- GenlistItem::WidgetType::toggle});
- item->setState(Singleton<VConfInterface>::instance().get(VCONFKEY_SETAPPL_ACCESSIBILITY_SCREEN_READER_SOUND_FEEDBACK, false));
-
- genlist->appendItem({"type1", "IDS_ACCS_TMBODY_STATUS_BAR_INFORMATION", {}, [this](auto item) { this->mouseUpGendialListCb(); }});
-
- genlist->appendItem({"multiline",
- {},
- "IDS_ACCS_SBODY_SELECT_WHICH_INFORMATION_FROM_INDICATORS_SHOWN_ON_THE_STATUS_BAR_WILL_BE_READ_OUT_WHEN_YOU_TRIPLE_"
- "TAP_THE_SCREEN_WITH_TWO_FINGERS_MSG",
- [this](auto item) {}});
-
- context_.navContext_.getNaviframe()->pushBack("IDS_ST_OPT_SETTINGS", genlist, [this]() {
- Singleton<TextToSpeech>::instance().clearSpeedChangedCallbacks();
- });
-}
-
-void ScreenReaderSettingsPage::mouseUpGendialListCb()
-{
- auto window = this->context_.navContext_.getWindow();
-
- this->popup_ = Widget::make<Popup>(window, "IDS_ACCS_TMBODY_STATUS_BAR_INFORMATION");
- this->popup_->setAlignment(ELM_NOTIFY_ALIGN_FILL, 1.0);
-
- auto removeCb = [p = this->popup_, window]() { window->removeChild(p); };
- this->popup_->setEextEventCallback(EEXT_CALLBACK_BACK, removeCb);
-
- auto box = Widget::make<Box>(this->popup_);
-
- auto genlist = Widget::make<Genlist>(box);
- genlist->setWeightHint(EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
- genlist->setAlignHint(EVAS_HINT_FILL, EVAS_HINT_FILL);
-
- for (auto i = 0u; i < vConfCheckData.size(); ++i) {
- auto screenreaderCheckbox = genlist->appendItem({"type1",
- vConfCheckData[i].label,
- {},
- [i](auto item) {
- vConfCheckData[i].state = item->getState();
- },
- GenlistItem::WidgetType::toggle});
- vConfCheckData[i].state = Singleton<VConfInterface>::instance().get(vConfCheckData[i].vconf_key, vConfCheckData[i].state);
- screenreaderCheckbox->setState(vConfCheckData[i].state);
- }
-
- genlist->blockScrolling(Elm_Scroller_Movement_Block(ELM_SCROLLER_MOVEMENT_BLOCK_VERTICAL | ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL));
- genlist->setScrollbarsVisibility(ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
-
- box->packEnd(genlist);
-
- box->setMinSizeHint(-1, ELM_SCALE_SIZE(POPUP_CONTENT_BASE_SIZE) * vConfCheckData.size());
- box->setMaxSizeHint(-1, ELM_SCALE_SIZE(POPUP_CONTENT_BASE_SIZE) * vConfCheckData.size());
- this->popup_->setContent(box);
-
- auto btnCancel = Widget::make<Button>(this->popup_, removeCb, "IDS_MSG_ACBUTTON_CANCEL_ABB", "popup");
- this->popup_->setPartContent("button1", btnCancel);
-
- auto onDone = [removeCb]() {
- removeCb();
-
- for (auto vConfData : vConfCheckData)
- Singleton<VConfInterface>::instance().set(vConfData.vconf_key, vConfData.state);
- };
-
- auto btnDone = Widget::make<Button>(this->popup_, onDone, "IDS_MSG_ACBUTTON_DONE_ABB", "popup");
- this->popup_->setPartContent("button2", btnDone);
-}
-
-void ScreenReaderSettingsPage::createSpeechRatePopup()
-{
- auto window = context_.navContext_.getWindow();
-
- popup_ = Widget::make<Popup>(window, "IDS_ST_BODY_SPEECH_RATE");
- popup_->setAlignment(ELM_NOTIFY_ALIGN_FILL, 1.0);
-
- auto removeCb = [p = popup_, window]() { window->removeChild(p); };
- popup_->setEextEventCallback(EEXT_CALLBACK_BACK, removeCb);
-
- auto layout = Widget::make<Layout>(popup_);
- layout->setFile(EDJDIR "/screen-reader-settings-popup.edj", "popup_text_slider_view_layout");
- layout->setPartText("elm.text.description", "IDS_SCR_POP_DRAG_THE_SLIDER_TO_SET_THE_SPEECH_RATE");
- layout->setWeightHint(EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
- popup_->setContent(layout);
-
- auto slider = Widget::make<Slider>(layout);
- slider->showIndicator(true);
- slider->setWeightHint(EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
- slider->setAlignHint(EVAS_HINT_FILL, EVAS_HINT_FILL);
- slider->setIndicatorFormat("%1.0f");
- slider->setRange(1, 15);
-
- auto speed = Singleton<TextToSpeech>::instance().getSpeed();
-
- slider->setStep(2);
- slider->setValue(speed);
- layout->setPartContent("slider", slider);
-
- auto cancelBtn = Widget::make<Button>(popup_, removeCb, "IDS_ST_BUTTON_CANCEL_ABB", "bottom");
- popup_->setPartContent("button1", cancelBtn);
-
- auto doneBtn = Widget::make<Button>(popup_,
- [p = popup_, window, slider, this]() {
- auto val = static_cast<size_t>(slider->getValue());
- Singleton<TextToSpeech>::instance().setSpeed(val);
- window->removeChild(p);
- },
- "IDS_ST_SK3_DONE",
- "bottom");
- popup_->setPartContent("button2", doneBtn);
-
- // TODO: add wrapper to the below function
- evas_object_event_callback_add(popup_->getObject(), EVAS_CALLBACK_DEL, onPopupDel, this);
-}
-
-std::string ScreenReaderSettingsPage::calculateSpeedPercentage()
-{
- auto speed = Singleton<TextToSpeech>::instance().getSpeed();
- auto speedRange = Singleton<TextToSpeech>::instance().getSpeedRange();
-
- auto denominator = speedRange.max - speedRange.min;
- auto speedPercent = 0.0;
- if (denominator != 0)
- speedPercent = (static_cast<double>(speed - speedRange.min) / denominator) * 100;
-
- DEBUG("TTS rate is %.0f", speedPercent);
- return std::to_string(std::lround(speedPercent));
-}
-
-void ScreenReaderSettingsPage::onPopupDel(void *data, Evas *e, Evas_Object *obj, void *event_info)
-{
- auto self = static_cast<ScreenReaderSettingsPage *>(data);
- auto percentage = self->calculateSpeedPercentage();
- self->speechRateItem_->setDescription(percentage);
-}