97668c8246d9773f2572d57576fe3f8854e06eea
[platform/core/uifw/dali-extension.git] / dali-extension / vector-animation-renderer / tizen-vector-animation-manager.cpp
1 /*
2  * Copyright (c) 2019 Samsung Electronics Co., Ltd.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *
16  */
17
18 // CLASS HEADER
19 #include <dali-extension/vector-animation-renderer/tizen-vector-animation-manager.h>
20
21 // EXTERNAL INCLUDES
22 #include <dali/integration-api/debug.h>
23 #include <dali/integration-api/adaptor-framework/adaptor.h>
24
25 namespace Dali
26 {
27
28 namespace Plugin
29 {
30
31 TizenVectorAnimationManager& TizenVectorAnimationManager::Get()
32 {
33   static TizenVectorAnimationManager animationManager;
34   return animationManager;
35 }
36
37 TizenVectorAnimationManager::TizenVectorAnimationManager()
38 : mEventHandlers(),
39   mTriggeredHandlers(),
40   mMutex(),
41   mEventTrigger()
42 {
43 }
44
45 TizenVectorAnimationManager::~TizenVectorAnimationManager()
46 {
47   DALI_LOG_RELEASE_INFO( "TizenVectorAnimationManager::~TizenVectorAnimationManager: this = %p\n", this );
48 }
49
50 void TizenVectorAnimationManager::AddEventHandler( TizenVectorAnimationEventHandler& handler )
51 {
52   if( mEventHandlers.end() == std::find( mEventHandlers.begin(), mEventHandlers.end(), &handler ) )
53   {
54     if( mEventHandlers.empty() )
55     {
56       Adaptor::Get().RegisterProcessor( *this );
57     }
58
59     if( !mEventTrigger )
60     {
61       mEventTrigger = std::unique_ptr< EventThreadCallback >( new EventThreadCallback( MakeCallback( this, &TizenVectorAnimationManager::OnEventTriggered ) ) );
62     }
63
64     mEventHandlers.push_back( &handler );
65   }
66 }
67
68 void TizenVectorAnimationManager::RemoveEventHandler( TizenVectorAnimationEventHandler& handler )
69 {
70   auto iter = std::find( mEventHandlers.begin(), mEventHandlers.end(), &handler );
71   if( iter != mEventHandlers.end() )
72   {
73     mEventHandlers.erase( iter );
74
75     if( mEventHandlers.empty() )
76     {
77       if( Adaptor::IsAvailable() )
78       {
79         Adaptor::Get().UnregisterProcessor( *this );
80       }
81
82       mEventTrigger.release();
83     }
84   }
85
86   {
87     Dali::Mutex::ScopedLock lock( mMutex );
88
89     auto triggeredHandler = std::find( mTriggeredHandlers.begin(), mTriggeredHandlers.end(), &handler );
90     if( triggeredHandler != mTriggeredHandlers.end() )
91     {
92       mTriggeredHandlers.erase( triggeredHandler );
93     }
94   }
95 }
96
97 void TizenVectorAnimationManager::TriggerEvent( TizenVectorAnimationEventHandler& handler )
98 {
99   Dali::Mutex::ScopedLock lock( mMutex );
100
101   if( mTriggeredHandlers.end() == std::find( mTriggeredHandlers.begin(), mTriggeredHandlers.end(), &handler ) )
102   {
103     mTriggeredHandlers.push_back( &handler );
104
105     mEventTrigger->Trigger();
106   }
107 }
108
109 void TizenVectorAnimationManager::Process()
110 {
111   OnEventTriggered();
112 }
113
114 // This function is called in the main thread.
115 void TizenVectorAnimationManager::OnEventTriggered()
116 {
117   std::vector< TizenVectorAnimationEventHandler* > handlers;
118
119   {
120     Dali::Mutex::ScopedLock lock( mMutex );
121
122     // Copy the list to the local variable and clear
123     handlers = mTriggeredHandlers;
124     mTriggeredHandlers.clear();
125   }
126
127   for( auto&& iter : handlers )
128   {
129     // Check if it is valid
130     auto handler = std::find( mEventHandlers.begin(), mEventHandlers.end(), iter );
131     if( handler != mEventHandlers.end() )
132     {
133       iter->NotifyEvent();
134     }
135   }
136 }
137
138 } // namespace Plugin
139
140 } // namespace Dali;