Fix Framework::GetResourcePath() for androidjni to return DALI_DATA_RO_DIR.
[platform/core/uifw/dali-adaptor.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   mRunning = true;
118 }
119
120 unsigned int Framework::AddIdle( int timeout, void* data, bool ( *callback )( void *data ) )
121 {
122   JNIEnv *env = nullptr;
123   JavaVM* javaVM = AndroidFramework::Get().GetJVM();
124   if( javaVM == nullptr || javaVM->GetEnv( reinterpret_cast<void **>( &env ), JNI_VERSION_1_6 ) != JNI_OK )
125   {
126     DALI_LOG_ERROR("Couldn't get JNI env.");
127     return -1;
128   }
129
130   jclass clazz = env->FindClass( "com/sec/daliview/DaliView" );
131   if ( !clazz )
132   {
133     DALI_LOG_ERROR("Couldn't find com.sec.daliview.DaliView.");
134     return -1;
135   }
136
137   jmethodID addIdle = env->GetStaticMethodID( clazz, "addIdle", "(JJJ)I" );
138   if (!addIdle)
139   {
140     DALI_LOG_ERROR("Couldn't find com.sec.daliview.DaliView.addIdle.");
141     return -1;
142   }
143
144   jint id = env->CallStaticIntMethod( clazz, addIdle, reinterpret_cast<jlong>( callback ), reinterpret_cast<jlong>( data ), static_cast<jlong>( timeout ) );
145   return static_cast<unsigned int>( id );
146 }
147
148 void Framework::RemoveIdle( unsigned int id )
149 {
150   JNIEnv *env = nullptr;
151   JavaVM* javaVM = AndroidFramework::Get().GetJVM();
152   if( javaVM == nullptr || javaVM->GetEnv( reinterpret_cast<void **>( &env ), JNI_VERSION_1_6 ) != JNI_OK )
153   {
154     DALI_LOG_ERROR("Couldn't get JNI env.");
155     return;
156   }
157
158   jclass clazz = env->FindClass( "com/sec/daliview/DaliView" );
159   if( !clazz )
160   {
161     DALI_LOG_ERROR("Couldn't find com.sec.daliview.DaliView.");
162     return;
163   }
164
165   jmethodID removeIdle = env->GetStaticMethodID( clazz, "removeIdle", "(I)V" );
166   if( !removeIdle )
167   {
168     DALI_LOG_ERROR("Couldn't find com.sec.daliview.DaliView.removeIdle.");
169     return;
170   }
171
172   env->CallStaticVoidMethod( clazz, removeIdle, static_cast<jint>( id ) );
173 }
174
175 void Framework::Quit()
176 {
177   DALI_LOG_ERROR("Quit does nothing for DaliView!");
178 }
179
180 bool Framework::IsMainLoopRunning()
181 {
182   return mRunning;
183 }
184
185 void Framework::AddAbortCallback( CallbackBase* callback )
186 {
187   mImpl->mAbortCallBack = callback;
188 }
189
190 std::string Framework::GetBundleName() const
191 {
192   return mBundleName;
193 }
194
195 void Framework::SetBundleName(const std::string& name)
196 {
197   mBundleName = name;
198 }
199
200 std::string Framework::GetBundleId() const
201 {
202   return mBundleId;
203 }
204
205 std::string Framework::GetResourcePath()
206 {
207   return DALI_DATA_RO_DIR;
208 }
209
210 std::string Framework::GetDataPath()
211 {
212   return "";
213 }
214
215 void Framework::SetBundleId(const std::string& id)
216 {
217   mBundleId = id;
218 }
219
220 void Framework::AbortCallback( )
221 {
222   // if an abort call back has been installed run it.
223   if (mImpl->mAbortCallBack)
224   {
225     CallbackBase::Execute( *mImpl->mAbortCallBack );
226   }
227   else
228   {
229     Quit();
230   }
231 }
232
233 bool Framework::AppStatusHandler(int type, void* data)
234 {
235   switch (type)
236   {
237     case APP_WINDOW_CREATED:
238       if( !mInitialised )
239       {
240         mObserver.OnInit();
241         mInitialised = true;
242       }
243
244       mObserver.OnSurfaceCreated( data );
245       break;
246
247     case APP_WINDOW_DESTROYED:
248       mObserver.OnSurfaceDestroyed( data );
249       break;
250
251     case APP_RESET:
252       mObserver.OnReset();
253       break;
254
255     case APP_RESUME:
256       mObserver.OnResume();
257       break;
258
259     case APP_PAUSE:
260       mObserver.OnPause();
261       break;
262
263     case APP_LANGUAGE_CHANGE:
264       mObserver.OnLanguageChanged();
265       break;
266
267     case APP_DESTROYED:
268       mObserver.OnTerminate();
269       mInitialised = false;
270       break;
271
272     default:
273       break;
274   }
275
276   return true;
277 }
278
279 void Framework::InitThreads()
280 {
281 }
282
283 std::string Framework::GetLanguage() const
284 {
285   return mImpl->GetLanguage();
286 }
287
288 std::string Framework::GetRegion() const
289 {
290   return mImpl->GetRegion();
291 }
292
293 } // namespace Adaptor
294
295 } // namespace Internal
296
297 } // namespace Dali