Merge "Direct Rendering" into devel/master
[platform/core/uifw/dali-adaptor.git] / dali / internal / adaptor / androidjni / framework-androidjni.cpp
1 /*
2  * Copyright (c) 2021 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/devel-api/adaptor-framework/application-devel.h>
23 #include <dali/integration-api/adaptor-framework/adaptor.h>
24 #include <dali/integration-api/adaptor-framework/android/android-framework.h>
25 #include <dali/integration-api/debug.h>
26 #include <dali/public-api/adaptor-framework/application.h>
27
28 // INTERNAL INCLUDES
29 #include <dali/internal/adaptor/android/android-framework-impl.h>
30 #include <dali/internal/adaptor/common/application-impl.h>
31 #include <dali/internal/system/common/callback-manager.h>
32
33 using namespace Dali;
34
35 namespace Dali
36 {
37 namespace Internal
38 {
39 namespace Adaptor
40 {
41 /**
42  * Impl to hide android data members
43  */
44 struct Framework::Impl
45 {
46   // Constructor
47
48   Impl(Framework* framework)
49   : mAbortCallBack(nullptr),
50     mCallbackManager(CallbackManager::New()),
51     mLanguage("NOT_SUPPORTED"),
52     mRegion("NOT_SUPPORTED")
53   {
54     AndroidFramework::GetImplementation(AndroidFramework::Get()).SetFramework(framework);
55   }
56
57   ~Impl()
58   {
59     AndroidFramework::GetImplementation(AndroidFramework::Get()).SetFramework(nullptr);
60
61     delete mAbortCallBack;
62     mAbortCallBack = nullptr;
63
64     // we're quiting the main loop so
65     // mCallbackManager->RemoveAllCallBacks() does not need to be called
66     // to delete our abort handler
67     delete mCallbackManager;
68     mCallbackManager = nullptr;
69   }
70
71   std::string GetLanguage() const
72   {
73     return mLanguage;
74   }
75
76   std::string GetRegion() const
77   {
78     return mRegion;
79   }
80
81   CallbackBase*    mAbortCallBack;
82   CallbackManager* mCallbackManager;
83   std::string      mLanguage;
84   std::string      mRegion;
85 };
86
87 Framework::Framework(Framework::Observer& observer, Framework::TaskObserver& taskObserver, int* argc, char*** argv, Type type, bool useUiThread)
88 : mObserver(observer),
89   mTaskObserver(taskObserver),
90   mInitialised(false),
91   mPaused(false),
92   mRunning(false),
93   mArgc(argc),
94   mArgv(argv),
95   mBundleName(""),
96   mBundleId(""),
97   mAbortHandler(MakeCallback(this, &Framework::AbortCallback)),
98   mImpl(NULL)
99 {
100   mImpl = new Impl(this);
101 }
102
103 Framework::~Framework()
104 {
105   if(mRunning)
106   {
107     Quit();
108   }
109
110   delete mImpl;
111   mImpl = nullptr;
112 }
113
114 void Framework::Run()
115 {
116   AndroidFramework::GetImplementation(AndroidFramework::Get()).SetFramework(this);
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 0;
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 0;
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 0;
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   Dali::Adaptor* adaptor = nullptr;
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       adaptor = &Dali::Adaptor::Get();
259       adaptor->Resume();
260       break;
261
262     case APP_PAUSE:
263       adaptor = &Dali::Adaptor::Get();
264       adaptor->Pause();
265       mObserver.OnPause();
266       break;
267
268     case APP_LANGUAGE_CHANGE:
269       mObserver.OnLanguageChanged();
270       break;
271
272     case APP_DESTROYED:
273       mObserver.OnTerminate();
274       mRunning     = false;
275       mPaused      = false;
276       mInitialised = false;
277       break;
278
279     default:
280       break;
281   }
282
283   return true;
284 }
285
286 void Framework::InitThreads()
287 {
288 }
289
290 std::string Framework::GetLanguage() const
291 {
292   return mImpl->GetLanguage();
293 }
294
295 std::string Framework::GetRegion() const
296 {
297   return mImpl->GetRegion();
298 }
299
300 } // namespace Adaptor
301
302 } // namespace Internal
303
304 } // namespace Dali