Initial copy from dali-adaptor repository
[platform/core/uifw/dali-adaptor-legacy.git] / dali / internal / adaptor / androidjni / framework-androidjni.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/internal/adaptor/common/framework.h>
20
21 // EXTERNAL INCLUDES
22 #include <dali/integration-api/debug.h>
23 #include <dali/integration-api/adaptor-framework/android/android-framework.h>
24 #include <dali/public-api/adaptor-framework/application.h>
25 #include <dali/devel-api/adaptor-framework/application-devel.h>
26
27 // INTERNAL INCLUDES
28 #include <dali/internal/adaptor/common/application-impl.h>
29 #include <dali/internal/adaptor/android/android-framework-impl.h>
30 #include <dali/internal/system/common/callback-manager.h>
31
32 using namespace Dali;
33
34 namespace Dali
35 {
36
37 namespace Internal
38 {
39
40 namespace Adaptor
41 {
42
43 /**
44  * Impl to hide android data members
45  */
46 struct Framework::Impl
47 {
48   // Constructor
49
50   Impl( Framework* framework )
51   : mAbortCallBack( nullptr ),
52     mCallbackManager( CallbackManager::New() ),
53     mLanguage( "NOT_SUPPORTED" ),
54     mRegion( "NOT_SUPPORTED" )
55   {
56     AndroidFramework::GetImplementation( AndroidFramework::Get() ).SetFramework( framework );
57   }
58
59   ~Impl()
60   {
61     AndroidFramework::GetImplementation( AndroidFramework::Get() ).SetFramework( nullptr );
62
63     delete mAbortCallBack;
64     mAbortCallBack = nullptr;
65
66     // we're quiting the main loop so
67     // mCallbackManager->RemoveAllCallBacks() does not need to be called
68     // to delete our abort handler
69     delete mCallbackManager;
70     mCallbackManager = nullptr;
71   }
72
73   std::string GetLanguage() const
74   {
75     return mLanguage;
76   }
77
78   std::string GetRegion() const
79   {
80     return mRegion;
81   }
82
83   CallbackBase* mAbortCallBack;
84   CallbackManager* mCallbackManager;
85   std::string mLanguage;
86   std::string mRegion;
87 };
88
89 Framework::Framework( Framework::Observer& observer, int *argc, char ***argv, Type type )
90 : mObserver( observer ),
91   mInitialised( false ),
92   mPaused( false ),
93   mRunning( false ),
94   mArgc( argc ),
95   mArgv( argv ),
96   mBundleName( "" ),
97   mBundleId( "" ),
98   mAbortHandler( MakeCallback( this, &Framework::AbortCallback ) ),
99   mImpl( NULL )
100 {
101   mImpl = new Impl( this );
102 }
103
104 Framework::~Framework()
105 {
106   if( mRunning )
107   {
108     Quit();
109   }
110
111   delete mImpl;
112   mImpl = nullptr;
113 }
114
115 void Framework::Run()
116 {
117   AndroidFramework::GetImplementation( AndroidFramework::Get() ).SetFramework( this );
118   mRunning = true;
119 }
120
121 unsigned int Framework::AddIdle( int timeout, void* data, bool ( *callback )( void *data ) )
122 {
123   JNIEnv *env = nullptr;
124   JavaVM* javaVM = AndroidFramework::Get().GetJVM();
125   if( javaVM == nullptr || javaVM->GetEnv( reinterpret_cast<void **>( &env ), JNI_VERSION_1_6 ) != JNI_OK )
126   {
127     DALI_LOG_ERROR("Couldn't get JNI env.");
128     return -1;
129   }
130
131   jclass clazz = env->FindClass( "com/sec/daliview/DaliView" );
132   if ( !clazz )
133   {
134     DALI_LOG_ERROR("Couldn't find com.sec.daliview.DaliView.");
135     return -1;
136   }
137
138   jmethodID addIdle = env->GetStaticMethodID( clazz, "addIdle", "(JJJ)I" );
139   if (!addIdle)
140   {
141     DALI_LOG_ERROR("Couldn't find com.sec.daliview.DaliView.addIdle.");
142     return -1;
143   }
144
145   jint id = env->CallStaticIntMethod( clazz, addIdle, reinterpret_cast<jlong>( callback ), reinterpret_cast<jlong>( data ), static_cast<jlong>( timeout ) );
146   return static_cast<unsigned int>( id );
147 }
148
149 void Framework::RemoveIdle( unsigned int id )
150 {
151   JNIEnv *env = nullptr;
152   JavaVM* javaVM = AndroidFramework::Get().GetJVM();
153   if( javaVM == nullptr || javaVM->GetEnv( reinterpret_cast<void **>( &env ), JNI_VERSION_1_6 ) != JNI_OK )
154   {
155     DALI_LOG_ERROR("Couldn't get JNI env.");
156     return;
157   }
158
159   jclass clazz = env->FindClass( "com/sec/daliview/DaliView" );
160   if( !clazz )
161   {
162     DALI_LOG_ERROR("Couldn't find com.sec.daliview.DaliView.");
163     return;
164   }
165
166   jmethodID removeIdle = env->GetStaticMethodID( clazz, "removeIdle", "(I)V" );
167   if( !removeIdle )
168   {
169     DALI_LOG_ERROR("Couldn't find com.sec.daliview.DaliView.removeIdle.");
170     return;
171   }
172
173   env->CallStaticVoidMethod( clazz, removeIdle, static_cast<jint>( id ) );
174 }
175
176 void Framework::Quit()
177 {
178   DALI_LOG_ERROR("Quit does nothing for DaliView!");
179 }
180
181 bool Framework::IsMainLoopRunning()
182 {
183   return mRunning;
184 }
185
186 void Framework::AddAbortCallback( CallbackBase* callback )
187 {
188   mImpl->mAbortCallBack = callback;
189 }
190
191 std::string Framework::GetBundleName() const
192 {
193   return mBundleName;
194 }
195
196 void Framework::SetBundleName(const std::string& name)
197 {
198   mBundleName = name;
199 }
200
201 std::string Framework::GetBundleId() const
202 {
203   return mBundleId;
204 }
205
206 std::string Framework::GetResourcePath()
207 {
208   return DALI_DATA_RO_DIR;
209 }
210
211 std::string Framework::GetDataPath()
212 {
213   return "";
214 }
215
216 void Framework::SetBundleId(const std::string& id)
217 {
218   mBundleId = id;
219 }
220
221 void Framework::AbortCallback( )
222 {
223   // if an abort call back has been installed run it.
224   if (mImpl->mAbortCallBack)
225   {
226     CallbackBase::Execute( *mImpl->mAbortCallBack );
227   }
228   else
229   {
230     Quit();
231   }
232 }
233
234 bool Framework::AppStatusHandler(int type, void* data)
235 {
236   switch (type)
237   {
238     case APP_WINDOW_CREATED:
239       if( !mInitialised )
240       {
241         mObserver.OnInit();
242         mInitialised = true;
243       }
244
245       mObserver.OnSurfaceCreated( data );
246       break;
247
248     case APP_WINDOW_DESTROYED:
249       mObserver.OnSurfaceDestroyed( data );
250       break;
251
252     case APP_RESET:
253       mObserver.OnReset();
254       break;
255
256     case APP_RESUME:
257       mObserver.OnResume();
258       break;
259
260     case APP_PAUSE:
261       mObserver.OnPause();
262       break;
263
264     case APP_LANGUAGE_CHANGE:
265       mObserver.OnLanguageChanged();
266       break;
267
268     case APP_DESTROYED:
269       mObserver.OnTerminate();
270       mRunning = false;
271       mPaused = false;
272       mInitialised = false;
273       break;
274
275     default:
276       break;
277   }
278
279   return true;
280 }
281
282 void Framework::InitThreads()
283 {
284 }
285
286 std::string Framework::GetLanguage() const
287 {
288   return mImpl->GetLanguage();
289 }
290
291 std::string Framework::GetRegion() const
292 {
293   return mImpl->GetRegion();
294 }
295
296 } // namespace Adaptor
297
298 } // namespace Internal
299
300 } // namespace Dali