2 * Copyright (c) 2019 Samsung Electronics Co., Ltd.
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
19 #include <dali/internal/system/android/callback-manager-android.h>
22 #include <dali/integration-api/debug.h>
23 #include <dali/integration-api/adaptor-framework/android/android-framework.h>
26 #include <dali/internal/adaptor/common/framework.h>
27 #include <dali/internal/adaptor/android/android-framework-impl.h>
39 * Structure contains the callback function and control options
47 CallbackData( CallbackBase* callback, bool hasReturnValue )
49 mCallback( callback ),
50 mRemoveFromContainerFunction( NULL ),
51 mHasReturnValue( hasReturnValue )
60 delete mRemoveFromContainerFunction;
64 CallbackBase* mCallback; ///< call back
65 CallbackBase* mRemoveFromContainerFunction; ///< Called to remove the callbackdata from the callback container
66 bool mHasReturnValue; ///< true if the callback function has a return value.
73 * Called from the main thread while idle.
75 bool IdleCallback(void *data)
78 CallbackData *callbackData = static_cast< CallbackData * >( data );
80 if( callbackData->mHasReturnValue )
83 bool retValue = CallbackBase::ExecuteReturn< bool >( *callbackData->mCallback );
91 // remove callback data from the container
92 CallbackBase::Execute( *callbackData->mRemoveFromContainerFunction, callbackData );
100 // remove callback data from the container
101 CallbackBase::Execute( *callbackData->mRemoveFromContainerFunction, callbackData );
104 CallbackBase::Execute( *callbackData->mCallback );
113 } // unnamed namespace
115 AndroidCallbackManager::AndroidCallbackManager()
121 void AndroidCallbackManager::Start()
123 DALI_ASSERT_DEBUG( mRunning == false );
128 void AndroidCallbackManager::Stop()
130 // make sure we're not called twice
131 DALI_ASSERT_DEBUG( mRunning == true );
133 RemoveAllCallbacks();
139 bool AndroidCallbackManager::AddIdleCallback( CallbackBase* callback, bool hasReturnValue )
146 CallbackData* callbackData = new CallbackData( callback, hasReturnValue );
147 callbackData->mRemoveFromContainerFunction = MakeCallback( this, &AndroidCallbackManager::RemoveCallbackFromContainer );
148 callbackData->mIdleId = AndroidFramework::GetFramework( Dali::Integration::AndroidFramework::Get() ).AddIdle( 0, callbackData, IdleCallback );
150 // add the call back to the container
151 mCallbackContainer.push_front( callbackData );
155 void AndroidCallbackManager::RemoveIdleCallback( CallbackBase* callback )
157 for( CallbackList::iterator it = mCallbackContainer.begin(),
158 endIt = mCallbackContainer.end();
162 CallbackData* data = *it;
164 if( data->mCallback == callback )
166 // remove callback data from the container.
167 CallbackBase::Execute( *data->mRemoveFromContainerFunction, data );
168 AndroidFramework::GetFramework( AndroidFramework::Get() ).RemoveIdle( data->mIdleId );
174 bool AndroidCallbackManager::ProcessIdle()
176 // @todo To be implemented.
180 void AndroidCallbackManager::ClearIdleCallbacks()
182 // @todo To be implemented.
185 bool AndroidCallbackManager::AddIdleEntererCallback( CallbackBase* callback )
192 CallbackData* callbackData = new CallbackData( callback, true );
194 callbackData->mRemoveFromContainerFunction = MakeCallback( this, &AndroidCallbackManager::RemoveCallbackFromContainer );
195 callbackData->mIdleId = AndroidFramework::GetFramework( Dali::Integration::AndroidFramework::Get() ).AddIdle( 0, callbackData, IdleCallback );
197 // add the call back to the container
198 mCallbackContainer.push_front( callbackData );
202 void AndroidCallbackManager::RemoveIdleEntererCallback( CallbackBase* callback )
204 for( CallbackList::iterator it = mCallbackContainer.begin(),
205 endIt = mCallbackContainer.end();
209 CallbackData* data = *it;
211 if( data->mCallback == callback )
213 // remove callback data from the container.
214 CallbackBase::Execute( *data->mRemoveFromContainerFunction, data );
215 AndroidFramework::GetFramework( Dali::Integration::AndroidFramework::Get() ).RemoveIdle( data->mIdleId );
221 void AndroidCallbackManager::RemoveCallbackFromContainer( CallbackData *callbackData )
223 mCallbackContainer.remove( callbackData );
226 void AndroidCallbackManager::RemoveAllCallbacks()
228 // always called from main thread
229 for( CallbackList::iterator iter = mCallbackContainer.begin(); iter != mCallbackContainer.end(); ++iter )
231 CallbackData* data = (*iter);
232 AndroidFramework::GetFramework( Dali::Integration::AndroidFramework::Get() ).RemoveIdle( data->mIdleId );
235 mCallbackContainer.clear();
238 // Creates a concrete interface for CallbackManager
239 CallbackManager* CallbackManager::New()
241 return new AndroidCallbackManager;
244 } // namespace Adaptor
246 } // namespace Internal