--- /dev/null
+/*
+ * Copyright 2017 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * 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 "AoSequencer.h"
+
+#include "common.h"
+
+namespace callui {
+
+ AoSequencer::AoSequencer(
+ const Elm_Interface_Atspi_Accessible *const current,
+ const Elm_Atspi_Relation_Type flowRelation) :
+ m_current(current),
+ m_flowRelation(flowRelation),
+
+ m_last(nullptr),
+ m_next(nullptr),
+
+ m_isNextSet(false),
+ m_isCurrentFound(false),
+ m_isComplete(false)
+ {
+ }
+
+ void AoSequencer::doProcessAo(
+ const Elm_Interface_Atspi_Accessible *const itemAo)
+ {
+ switch (m_flowRelation) {
+ case ELM_ATSPI_RELATION_FLOWS_TO:
+
+ if (itemAo == m_current) {
+ setNext(itemAo);
+ m_isCurrentFound = true;
+ return;
+ }
+ if (m_isCurrentFound) {
+ setNext(itemAo);
+ m_isComplete = true;
+ return;
+ }
+ break;
+
+ case ELM_ATSPI_RELATION_FLOWS_FROM:
+
+ if (itemAo == m_current) {
+ setNext(m_isNextSet ? m_last : itemAo);
+ m_isComplete = true;
+ return;
+ }
+ m_last = itemAo;
+ break;
+
+ default:
+ WLOG("Unknown: %d", m_flowRelation);
+ break;
+ }
+
+ if (!m_isNextSet) {
+ setNext(itemAo);
+ }
+ }
+
+ void AoSequencer::setNext(
+ const Elm_Interface_Atspi_Accessible *const itemAo)
+ {
+ m_next = itemAo;
+ m_isNextSet = true;
+ }
+}
--- /dev/null
+/*
+ * Copyright 2017 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * 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.
+ */
+
+#ifndef __CALL_UI_VIEW_AO_SEQUENCER_H__
+#define __CALL_UI_VIEW_AO_SEQUENCER_H__
+
+#include "ucl/gui/Atspi.h"
+
+#include "types.h"
+
+namespace callui {
+
+ /**
+ * @brief Finds next object in the Access objects highlight flow sequence
+ */
+ class AoSequencer final : private ucl::NonCopyable {
+ public:
+ /**
+ * @brief Constructor
+ * @param[in] current Currently focused Access object
+ * @param[in] flowRelation Flow relation for finding next Access object
+ */
+ AoSequencer(const Elm_Interface_Atspi_Accessible *current,
+ Elm_Atspi_Relation_Type flowRelation);
+
+ /**
+ * @brief Denotes break in sequence for allowing system default flow
+ * @return Reference to AoSequencer object
+ */
+ AoSequencer &processDefault();
+
+ /**
+ * @brief Passes next object in flow sequence
+ * @param[in] item Item in highlight flow sequence. Any object for which
+ * as_ao() function may be called. NULL is ignored.
+ * @return Reference to AoSequencer object
+ */
+ template <class ITEM>
+ AoSequencer &process(const ITEM &item);
+
+ /**
+ * @brief Passes next object list in flow sequence
+ * @param[in] items Item list in highlight flow sequence.
+ * @return Reference to AoSequencer object
+ */
+ template <class ITEMS>
+ AoSequencer &processEach(const ITEMS &items);
+
+ /**
+ * @brief Passes next object range in flow sequence
+ * @param[in] begin Begin iterator of the range
+ * @param[in] end End iterator of the range
+ * @return Reference to AoSequencer object
+ */
+ template <class ITERATOR>
+ AoSequencer &processEach(ITERATOR begin, ITERATOR end);
+
+ /**
+ * @brief Gets next Acces object in highlight flow sequence
+ * @details Result is base on constructor parameters and processed
+ * sequence. Result may change during processing.
+ * If current object was not found in the processed sequence
+ * first object from the sequence is returned. If it is not
+ * possible to get next object (current is already last) then
+ * current object is returned. NULL is returned for default
+ * processing.
+ * @return Next access object in highlight flow sequence
+ */
+ const Elm_Interface_Atspi_Accessible *getNext();
+
+ private:
+ template <class ITEM>
+ void doProcess(const ITEM &item);
+ void doProcessAo(const Elm_Interface_Atspi_Accessible *itemAo);
+ void setNext(const Elm_Interface_Atspi_Accessible *itemAo);
+
+ private:
+ const Elm_Interface_Atspi_Accessible *const m_current;
+ const Elm_Atspi_Relation_Type m_flowRelation;
+
+ const Elm_Interface_Atspi_Accessible *m_last;
+ const Elm_Interface_Atspi_Accessible *m_next;
+
+ bool m_isNextSet;
+ bool m_isCurrentFound;
+ bool m_isComplete;
+ };
+}
+
+#include "AoSequencer.hpp"
+
+#endif // __CALL_UI_VIEW_AO_SEQUENCER_H__
--- /dev/null
+/*
+ * Copyright 2017 Samsung Electronics Co., Ltd
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.org/license/
+ *
+ * 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.
+ */
+
+namespace callui {
+
+ inline AoSequencer &AoSequencer::processDefault()
+ {
+ if (!m_isComplete) {
+ doProcessAo(nullptr);
+ }
+ return *this;
+ }
+
+ template <class ITEM>
+ inline AoSequencer &AoSequencer::process(const ITEM &item)
+ {
+ if (!m_isComplete) {
+ doProcess(item);
+ }
+ return *this;
+ }
+
+ template <class ITEMS>
+ inline AoSequencer &AoSequencer::processEach(const ITEMS &items)
+ {
+ if (!m_isComplete) {
+ for (const auto &item: items) {
+ doProcess(item);
+ if (m_isComplete) {
+ break;
+ }
+ }
+ }
+ return *this;
+ }
+
+ template <class ITERATOR>
+ inline AoSequencer &AoSequencer::processEach(
+ const ITERATOR begin, const ITERATOR end)
+ {
+ if (!m_isComplete) {
+ for (auto it = begin; it != end; ++it) {
+ doProcess(*it);
+ if (m_isComplete) {
+ break;
+ }
+ }
+ }
+ return *this;
+ }
+
+ inline const Elm_Interface_Atspi_Accessible *AoSequencer::getNext()
+ {
+ return m_next;
+ }
+
+ template <class ITEM>
+ inline void AoSequencer::doProcess(const ITEM &item)
+ {
+ using ucl::as_ao;
+ if (const auto itemAo = as_ao(item)) {
+ doProcessAo(itemAo);
+ }
+ }
+}
profile = wearable-4.0
# C/CPP Sources
-USER_SRCS = call-ui/presenters/dialogs/base/Dialog.cpp call-ui/view/VolumeControl.cpp call-ui/model/impl/CallInfo.cpp call-ui/presenters/items/SimpleListItem.cpp call-ui/model/impl/IncomingCall.cpp ucl/source/appfw/helpers.cpp ucl/source/mvp/ListItemPresenter.cpp call-ui/model/impl/RejectMsg.cpp ucl/source/gui/Genlist.cpp ucl/source/util/types/Result.cpp call-ui/model/impl/ConferenceCallInfo.cpp call-ui/presenters/items/RejectMsgListItem.cpp call-ui/model/impl/BluetoothManager.cpp ucl/source/gui/Layout.cpp call-ui/presenters/misc/MotionSensorPresenter.cpp call-ui/model/impl/RssiStateSource.cpp call-ui/presenters/Instance.cpp call-ui/model/impl/ActiveCall.cpp call-ui/model/impl/SimSlotStateSource.cpp call-ui/presenters/misc/AcceptRejectPresenter.cpp ucl/source/gui/WidgetItem.cpp call-ui/presenters/pages/MainPage.cpp ucl/source/gui/NaviItem.cpp call-ui/presenters/misc/DeviceStatePresenter.cpp call-ui/model/impl/ContactInfoProvider.cpp call-ui/model/impl/HdVoiceStateSource.cpp ucl/source/gui/Window.cpp call-ui/model/impl/ConnectionStateSource.cpp call-ui/presenters/misc/RejectMsgPresenter.cpp call-ui/presenters/pages/KeypadPage.cpp ucl/source/util/logging.cpp ucl/source/appfw/UIApp.cpp call-ui/presenters/misc/AccessoryPresenter.cpp call-ui/model/impl/ContactInfo.cpp call-ui/model/impl/EndCall.cpp call-ui/view/Slider.cpp call-ui/model/impl/RejectMsgProvider.cpp ucl/source/mvp/GuiPresenter.cpp ucl/source/appfw/InstanceManagerBase.cpp call-ui/model/impl/BatteryStateSource.cpp ucl/source/gui/Widget.cpp call-ui/presenters/dialogs/AcceptDialog.cpp call-ui/types.cpp call-ui/presenters/misc/helpers.cpp call-ui/model/impl/IndicatorStateProvider.cpp call-ui/view/AcceptRejectWidget.cpp ucl/source/misc/Timeout.cpp call-ui/resources.cpp ucl/source/util/types/classTypes.cpp call-ui/model/CallUIBuilder.cpp call-ui/presenters/misc/CallStatusPresenter.cpp call-ui/model/impl/HeldCall.cpp call-ui/model/impl/SoundManager.cpp ucl/source/gui/EdjeWidget.cpp call-ui/model/impl/MsgClient.cpp call-ui/presenters/InstanceManager.cpp call-ui/presenters/pages/base/Page.cpp call-ui/presenters/misc/MoreOptionsPresenter.cpp call-ui/presenters/misc/IndicatorPresenter.cpp call-ui/presenters/misc/AtspiHighlightHelper.cpp ucl/source/gui/Naviframe.cpp call-ui/model/impl/CallUI.cpp ucl/source/gui/ElmWidget.cpp ucl/source/gui/RadioBox.cpp ucl/source/misc/Variant.cpp call-ui/view/helpers.cpp call-ui/main.cpp call-ui/model/impl/CallManager.cpp call-ui/presenters/misc/CallInfoPresenter.cpp ucl/source/appfw/SysEventProvider.cpp call-ui/model/impl/CallClient.cpp ucl/source/mvp/ListPresenter.cpp
+USER_SRCS = call-ui/presenters/dialogs/base/Dialog.cpp call-ui/view/VolumeControl.cpp call-ui/model/impl/CallInfo.cpp call-ui/presenters/items/SimpleListItem.cpp call-ui/model/impl/IncomingCall.cpp ucl/source/appfw/helpers.cpp ucl/source/mvp/ListItemPresenter.cpp call-ui/model/impl/RejectMsg.cpp ucl/source/gui/Genlist.cpp ucl/source/util/types/Result.cpp call-ui/model/impl/ConferenceCallInfo.cpp call-ui/presenters/items/RejectMsgListItem.cpp call-ui/model/impl/BluetoothManager.cpp ucl/source/gui/Layout.cpp call-ui/presenters/misc/MotionSensorPresenter.cpp call-ui/model/impl/RssiStateSource.cpp call-ui/presenters/Instance.cpp call-ui/model/impl/ActiveCall.cpp call-ui/view/AoSequencer.cpp call-ui/model/impl/SimSlotStateSource.cpp call-ui/presenters/misc/AcceptRejectPresenter.cpp ucl/source/gui/WidgetItem.cpp call-ui/presenters/pages/MainPage.cpp ucl/source/gui/NaviItem.cpp call-ui/presenters/misc/DeviceStatePresenter.cpp call-ui/model/impl/ContactInfoProvider.cpp call-ui/model/impl/HdVoiceStateSource.cpp ucl/source/gui/Window.cpp call-ui/model/impl/ConnectionStateSource.cpp call-ui/presenters/misc/RejectMsgPresenter.cpp call-ui/presenters/pages/KeypadPage.cpp ucl/source/util/logging.cpp ucl/source/appfw/UIApp.cpp call-ui/presenters/misc/AccessoryPresenter.cpp call-ui/model/impl/ContactInfo.cpp call-ui/model/impl/EndCall.cpp call-ui/view/Slider.cpp call-ui/model/impl/RejectMsgProvider.cpp ucl/source/mvp/GuiPresenter.cpp ucl/source/appfw/InstanceManagerBase.cpp call-ui/model/impl/BatteryStateSource.cpp ucl/source/gui/Widget.cpp call-ui/presenters/dialogs/AcceptDialog.cpp call-ui/types.cpp call-ui/presenters/misc/helpers.cpp call-ui/model/impl/IndicatorStateProvider.cpp call-ui/view/AcceptRejectWidget.cpp ucl/source/misc/Timeout.cpp call-ui/resources.cpp ucl/source/util/types/classTypes.cpp call-ui/model/CallUIBuilder.cpp call-ui/presenters/misc/CallStatusPresenter.cpp call-ui/model/impl/HeldCall.cpp call-ui/model/impl/SoundManager.cpp ucl/source/gui/EdjeWidget.cpp call-ui/model/impl/MsgClient.cpp call-ui/presenters/InstanceManager.cpp call-ui/presenters/pages/base/Page.cpp call-ui/presenters/misc/MoreOptionsPresenter.cpp call-ui/presenters/misc/IndicatorPresenter.cpp call-ui/presenters/misc/AtspiHighlightHelper.cpp ucl/source/gui/Naviframe.cpp call-ui/model/impl/CallUI.cpp ucl/source/gui/ElmWidget.cpp ucl/source/gui/RadioBox.cpp ucl/source/misc/Variant.cpp call-ui/view/helpers.cpp call-ui/main.cpp call-ui/model/impl/CallManager.cpp call-ui/presenters/misc/CallInfoPresenter.cpp ucl/source/appfw/SysEventProvider.cpp call-ui/model/impl/CallClient.cpp ucl/source/mvp/ListPresenter.cpp
# EDC Sources
USER_EDCS =