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