From 54be5f49c53acf0cf6f62fd409d1fda6e07c8637 Mon Sep 17 00:00:00 2001 From: Sinjae Lee Date: Fri, 16 May 2014 15:02:32 +0900 Subject: [PATCH] (FocusManager) Updated accessibility features 1. Shoot accessibility pan to hit-actor instead of currently focused actor (done) 2. Added sound resources (done) Play sound for focus, end of focus list 3. Added Get/SetEndcapFeedbackEnabled api to handle the feedback In case of evas-plugin usage, need to disable endcap feedback since EFL will do. 4. TODO: support tap & hold event on focused actor (NEXT PATCH) --- .../internal/focus-manager/focus-manager-impl.cpp | 65 +++++++++++++++++++-- .../internal/focus-manager/focus-manager-impl.h | 14 +++++ .../public-api/focus-manager/focus-manager.cpp | 10 ++++ base/dali-toolkit/sounds/End_of_List.ogg | Bin 0 -> 15242 bytes base/dali-toolkit/sounds/Focus.ogg | Bin 0 -> 5454 bytes base/dali-toolkit/sounds/List_scroll.ogg | Bin 0 -> 6206 bytes base/dali-toolkit/sounds/file.list | 4 ++ build/slp/dali-toolkit-base/Makefile.am | 5 ++ build/slp/dali-toolkit/Makefile.am | 6 ++ .../public-api/focus-manager/focus-manager.h | 19 ++++++ packaging/dali-toolkit.spec | 2 + 11 files changed, 121 insertions(+), 4 deletions(-) create mode 100644 base/dali-toolkit/sounds/End_of_List.ogg create mode 100644 base/dali-toolkit/sounds/Focus.ogg create mode 100644 base/dali-toolkit/sounds/List_scroll.ogg create mode 100644 base/dali-toolkit/sounds/file.list diff --git a/base/dali-toolkit/internal/focus-manager/focus-manager-impl.cpp b/base/dali-toolkit/internal/focus-manager/focus-manager-impl.cpp index 80e5c2d..a52d480 100644 --- a/base/dali-toolkit/internal/focus-manager/focus-manager-impl.cpp +++ b/base/dali-toolkit/internal/focus-manager/focus-manager-impl.cpp @@ -44,6 +44,9 @@ const char * const IS_FOCUS_GROUP("is-focus-group"); const char* FOCUS_BORDER_IMAGE_PATH = DALI_IMAGE_DIR "B16-8_TTS_focus.png"; const Vector4 FOCUS_BORDER_IMAGE_BORDER = Vector4(7.0f, 7.0f, 7.0f, 7.0f); +const char* FOCUS_SOUND_FILE = DALI_SOUND_DIR "Focus.ogg"; +const char* FOCUS_CHAIN_END_SOUND_FILE = DALI_SOUND_DIR "End_of_List.ogg"; + /** * The function to be used in the hit-test algorithm to check whether the actor is hittable. */ @@ -90,6 +93,8 @@ bool IsActorFocusableFunction(Actor actor, Dali::HitTestAlgorithm::TraverseType FocusManager::FocusManager() : mIsWrapped(false), mIsFocusWithinGroup(false), + mIsEndcapFeedbackEnabled(true), + mIsEndcapFeedbackPlayed(false), mCurrentFocusActor(FocusIDPair(0, 0)), mFocusIndicatorActor(Actor()), mRecursiveFocusMoveCounter(0), @@ -331,6 +336,9 @@ bool FocusManager::DoSetCurrentFocusActor(const unsigned int actorID) if(mIsAccessibilityTtsEnabled) { + Dali::SoundPlayer soundPlayer = Dali::SoundPlayer::Get(); + soundPlayer.PlaySound(FOCUS_SOUND_FILE); + // Play the accessibility attributes with the TTS player. Dali::TtsPlayer player = Dali::TtsPlayer::Get(Dali::TtsPlayer::SCREEN_READER); @@ -540,6 +548,16 @@ bool FocusManager::GetWrapMode() const return mIsWrapped; } +void FocusManager::SetEndCapFeedbackEnabled(bool enabled) +{ + mIsEndcapFeedbackEnabled = enabled; +} + +bool FocusManager::GetEndCapFeedbackEnabled() const +{ + return mIsEndcapFeedbackEnabled; +} + void FocusManager::SetFocusIndicatorActor(Actor indicator) { mFocusIndicatorActor = indicator; @@ -560,6 +578,20 @@ bool FocusManager::DoMoveFocus(FocusIDIter focusIDIter, bool forward, bool wrapp { if(wrapped) { + if(mIsEndcapFeedbackEnabled) + { + if(mIsEndcapFeedbackPlayed == false) + { + // play sound & skip to move once + Dali::SoundPlayer soundPlayer = Dali::SoundPlayer::Get(); + soundPlayer.PlaySound(FOCUS_CHAIN_END_SOUND_FILE); + + mIsEndcapFeedbackPlayed = true; + return true; + } + mIsEndcapFeedbackPlayed = false; + } + if(forward) { focusIDIter = mFocusIDContainer.begin(); @@ -572,6 +604,12 @@ bool FocusManager::DoMoveFocus(FocusIDIter focusIDIter, bool forward, bool wrapp } else { + if(mIsEndcapFeedbackEnabled) + { + Dali::SoundPlayer soundPlayer = Dali::SoundPlayer::Get(); + soundPlayer.PlaySound(FOCUS_CHAIN_END_SOUND_FILE); + } + DALI_LOG_INFO( gLogFilter, Debug::General, "[%s:%d] Overshot\n", __FUNCTION__, __LINE__); // Send notification for handling overshooted situation mFocusOvershotSignalV2.Emit(GetCurrentFocusActor(), forward ? Toolkit::FocusManager::OVERSHOT_NEXT : Toolkit::FocusManager::OVERSHOT_PREVIOUS); @@ -824,7 +862,21 @@ bool FocusManager::HandlePanGesture(const Integration::PanGestureEvent& panEvent { bool handled = false; - Actor currentGesturedActor = GetCurrentFocusActor(); + if( panEvent.state == Gesture::Started ) + { + // Find the focusable actor at the event position + Dali::HitTestAlgorithm::Results results; + AccessibilityManager manager = AccessibilityManager::Get(); + + Dali::HitTestAlgorithm::HitTest( Stage::GetCurrent(), panEvent.currentPosition, results, IsActorFocusableFunction ); + mCurrentGesturedActor = results.actor; + + if(!mCurrentGesturedActor) + { + DALI_LOG_ERROR("Gesture detected, but no hit actor"); + } + } + Actor rootActor = Stage::GetCurrent().GetRootLayer(); Dali::PanGesture pan(panEvent.state); @@ -836,9 +888,9 @@ bool FocusManager::HandlePanGesture(const Integration::PanGestureEvent& panEvent pan.screenVelocity.y = pan.screenDisplacement.y / panEvent.timeDelta; // Only handle the pan gesture when the current focused actor is scrollable or within a scrollable actor - while(currentGesturedActor && currentGesturedActor != rootActor && !handled) + while(mCurrentGesturedActor && mCurrentGesturedActor != rootActor && !handled) { - Dali::Toolkit::Control control = Dali::Toolkit::Control::DownCast(currentGesturedActor); + Dali::Toolkit::Control control = Dali::Toolkit::Control::DownCast(mCurrentGesturedActor); if(control) { Vector2 localCurrent; @@ -858,7 +910,12 @@ bool FocusManager::HandlePanGesture(const Integration::PanGestureEvent& panEvent // If the gesture is not handled by the control, check its parent if(!handled) { - currentGesturedActor = currentGesturedActor.GetParent(); + mCurrentGesturedActor = mCurrentGesturedActor.GetParent(); + + if(!mCurrentGesturedActor) + { + DALI_LOG_ERROR("no more gestured actor"); + } } else { diff --git a/base/dali-toolkit/internal/focus-manager/focus-manager-impl.h b/base/dali-toolkit/internal/focus-manager/focus-manager-impl.h index aefd0f6..de2cd39 100644 --- a/base/dali-toolkit/internal/focus-manager/focus-manager-impl.h +++ b/base/dali-toolkit/internal/focus-manager/focus-manager-impl.h @@ -170,6 +170,16 @@ public: bool GetWrapMode() const; /** + * @copydoc Toolkit::FocusManager::SetEndCapFeedbackEnabled + */ + void SetEndCapFeedbackEnabled(bool enabled); + + /** + * @copydoc Toolkit::FocusManager::GetEndCapFeedbackEnabled + */ + bool GetEndCapFeedbackEnabled() const; + + /** * @copydoc Toolkit::FocusManager::SetFocusIndicatorActor */ void SetFocusIndicatorActor(Actor indicator); @@ -365,10 +375,14 @@ private: bool mIsWrapped; ///< Whether the focus movement is wrapped around or not bool mIsFocusWithinGroup; ///< Whether the focus movement is limited to the current focus group or not + bool mIsEndcapFeedbackEnabled; ///< Whether the endcap feedback need to be played when the focus leaves the end or vice versa + bool mIsEndcapFeedbackPlayed; ///< Whether the endcap feedback was played or not + FocusIDContainer mFocusIDContainer; ///< The container to look up actor ID by focus order IDAdditionalInfoContainer mIDAdditionalInfoContainer; ///< The container to look up additional information by actor ID FocusIDPair mCurrentFocusActor; ///< The focus order and actor ID of current focused actor + Actor mCurrentGesturedActor; ///< The actor that will handle the gesture Actor mFocusIndicatorActor; ///< The focus indicator actor shared by all the focusable actors for highlight diff --git a/base/dali-toolkit/public-api/focus-manager/focus-manager.cpp b/base/dali-toolkit/public-api/focus-manager/focus-manager.cpp index d172135..873ec65 100644 --- a/base/dali-toolkit/public-api/focus-manager/focus-manager.cpp +++ b/base/dali-toolkit/public-api/focus-manager/focus-manager.cpp @@ -170,6 +170,16 @@ bool FocusManager::GetWrapMode() const return GetImpl(*this).GetWrapMode(); } +void FocusManager::SetEndCapFeedbackEnabled(bool enabled) +{ + GetImpl(*this).SetEndCapFeedbackEnabled(enabled); +} + +bool FocusManager::GetEndCapFeedbackEnabled() const +{ + return GetImpl(*this).GetEndCapFeedbackEnabled(); +} + void FocusManager::SetFocusIndicatorActor(Actor indicator) { GetImpl(*this).SetFocusIndicatorActor(indicator); diff --git a/base/dali-toolkit/sounds/End_of_List.ogg b/base/dali-toolkit/sounds/End_of_List.ogg new file mode 100644 index 0000000000000000000000000000000000000000..3777683b5d2fd095514f6da65b61a4b6ea1431fd GIT binary patch literal 15242 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 literal 0 HcmV?d00001 diff --git a/base/dali-toolkit/sounds/Focus.ogg b/base/dali-toolkit/sounds/Focus.ogg new file mode 100644 index 0000000000000000000000000000000000000000..aec6d44461edf13f55df86b179e6ad2b08182b80 GIT binary patch literal 5454 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 P4h@bLPM?PXcs%~UVy)4^ literal 0 HcmV?d00001 diff --git a/base/dali-toolkit/sounds/List_scroll.ogg b/base/dali-toolkit/sounds/List_scroll.ogg new file mode 100644 index 0000000000000000000000000000000000000000..c40fd6a7627746b88d11ca44590c2c0d2d245f03 GIT binary patch literal 6206 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