fix return valid exception when ValidateApplicationAttribute is failed for SetAppWidg...
[framework/osp/shell.git] / src / FShell_AppWidgetProviderManagerImpl.cpp
1 //
2 // Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
3 //
4 // Licensed under the Flora License, Version 1.1 (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://floralicense.org/license/
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  * @file        FShell_AppWidgetManagerImpl.cpp
19  * @brief       This is the implementation for the _AppWidgetManagerImpl class.
20  */
21
22 #include <unique_ptr.h>
23 #include <errno.h>
24 #include <string.h>
25 #include <package_manager.h>
26 #include <shortcut.h>
27 #include <livebox-errno.h>
28 #include <provider_buffer.h>
29 #include <livebox-service.h>
30
31 #include <FBaseSysLog.h>
32 #include <FBase.h>
33 #include <FApp.h>
34 #include <FGrpDimension.h>
35
36 #include <FApp_Aul.h>
37 #include <FApp_AppInfo.h>
38 #include <FApp_AppImpl.h>
39 #include <FApp_ServiceAppImpl.h>
40 #include <FAppPkg_PackageManagerImpl.h>
41 #include <FAppPkg_PackageInfoImpl.h>
42 #include <FBase_StringConverter.h>
43 #include <FSec_AccessController.h>
44
45 #include <FShellAppWidgetProviderInfo.h>
46 #include <FShellAppWidgetProvider.h>
47 #include <FShellAppWidgetPopupProvider.h>
48 #include <FShellAppWidgetFrame.h>
49 #include <FShellAppWidgetPopup.h>
50 #include <FShellIAppWidgetProviderFactory.h>
51 #include <FShellIAppWidgetPopupProviderFactory.h>
52
53 #include <FShell_TemplateUtil.h>
54 #include <FShell_IAppWidgetTouchEventListener.h>
55 #include "FShell_AppWidgetManagerProxy.h"
56 #include "FShell_AppWidgetProviderManagerImpl.h"
57 #include "FShell_AppWidgetProviderInfoImpl.h"
58
59 namespace Tizen { namespace Shell
60 {
61 using namespace std;
62 using namespace Tizen::Base;
63 using namespace Tizen::Base::Collection;
64 using namespace Tizen::App;
65 using namespace Tizen::App::Package;
66 using namespace Tizen::Security;
67 using namespace Tizen::Graphics;
68
69 extern const wchar_t APPWIDGET_ON_ADD[] = L"http://tizen.org/appcontrol/appwidget/add";
70 extern const wchar_t APPWIDGET_ON_REMOVE[] = L"http://tizen.org/appcontrol/appwidget/remove";
71 extern const wchar_t APPWIDGET_ON_UPDATE[] = L"http://tizen.org/appcontrol/appwidget/update";
72 extern const wchar_t APPWIDGET_ON_RESIZE[] = L"http://tizen.org/appcontrol/appwidget/resize";
73 extern const wchar_t APPWIDGET_ON_TOUCH[] = L"http://tizen.org/appcontrol/appwidget/touch";
74 extern const wchar_t APPWIDGET_POPUP_ON_CREATE[] = L"http://tizen.org/appcontrol/appwidgetpopup/create";
75 extern const wchar_t APPWIDGET_POPUP_ON_DESTROY[] = L"http://tizen.org/appcontrol/appwidgetpopup/destroy";
76 extern const wchar_t APPWIDGET_POPUP_ON_TOUCH[] = L"http://tizen.org/appcontrol/appwidgetpopup/touch";
77 extern const wchar_t APPWIDGET_POPUP_PREFIX[] = L"http://tizen.org/appcontrol/appwidgetpopup";
78 extern const wchar_t INVALID_INSTANCE[] = L"file://invalid instance id";
79
80 extern const String ARG_KEY_INSTANCE_ID = L"_InstanceId";
81 extern const String ARG_KEY_PROVIDER_NAME = L"_ProviderName";
82 extern const String ARG_KEY_USER_INFO = L"_UserInfo";
83 extern const String ARG_KEY_X = L"_X";
84 extern const String ARG_KEY_Y = L"_Y";
85 extern const String ARG_KEY_WIDTH = L"_Width";
86 extern const String ARG_KEY_HEIGHT = L"_Height";
87 extern const String ARG_KEY_POPUP_WIDTH = L"_PopupWidth";
88 extern const String ARG_KEY_POPUP_HEIGHT = L"_PopupHeight";
89 extern const String ARG_KEY_ARGUMENT = L"_Argument";
90 extern const String ARG_KEY_EVENT_TYPE = L"_EventType";
91 extern const String ARG_KEY_TIME_STAMP = L"_TimeStamp";
92
93 _AppWidgetProviderManagerImpl::_AppWidgetProviderManagerImpl()
94         :__pAppWidgetFactory(null)
95         ,__pAppWidgetPopupProviderFactory(null)
96         ,__pAppWidgetPopupProvider(null)
97         ,__AppWidgetPopupTouchEventListener(null)
98 {
99         SysLog(NID_SHELL, "");
100 }
101
102 _AppWidgetProviderManagerImpl::~_AppWidgetProviderManagerImpl()
103 {
104         SysLog(NID_SHELL, "");
105 }
106
107 _AppWidgetProviderManagerImpl*
108 _AppWidgetProviderManagerImpl::GetInstance()
109 {
110         static _AppWidgetProviderManagerImpl* __pAppWidgetManagerImpl = null;
111         if( __pAppWidgetManagerImpl == null)
112         {
113                 __pAppWidgetManagerImpl = new (nothrow)_AppWidgetProviderManagerImpl;
114                 SysTryReturn(NID_SHELL, __pAppWidgetManagerImpl, null, E_OUT_OF_MEMORY, "Allocating new _AppWidgetManagerProxy failed.");
115
116                 result r = __pAppWidgetManagerImpl->Construct();
117                 SysTryReturn(NID_SHELL, !IsFailed(r), null, r, "[%s] Propagating.", GetErrorMessage(r));
118         }
119         return __pAppWidgetManagerImpl;
120 }
121
122 result
123 _AppWidgetProviderManagerImpl::Construct()
124 {
125         SysLog(NID_SHELL, "Enter.");
126
127         __appwidgetProviders.Construct();
128         __touchEventListeners.Construct();
129
130         _AppImpl::GetInstance()->SetAppControlProviderInternalEventListener(this);
131         _ServiceAppImpl* pServiceAppImpl = _ServiceAppImpl::GetInstance();
132         if( pServiceAppImpl)
133         {
134                 pServiceAppImpl->SetAppTerminatingInternalEventListener(this);
135         }
136
137         SysLog(NID_SHELL, "Exit.");
138         return E_SUCCESS;
139 }
140
141 result
142 _AppWidgetProviderManagerImpl::SetAppWidgetProviderFactory(IAppWidgetProviderFactory& factory)
143 {
144         result r = ValidateApplicationAttribute();
145         if (IsFailed(r))
146         {
147                 SysLogException(NID_SHELL, E_INVALID_OPERATION, "The application's attribute does not meet the condition to provide AppWidget. 'LifeDuration' and 'UseUi' attribute should be specified in application manifest and it's not allowed that declaring 'AUTO_RESTART' attribute for AppWidget.");
148
149                 r = SendResult(INVALID_INSTANCE, false);
150                 SysTryLog(NID_SHELL, !IsFailed(r), "Because the context for this dynamic box is removed, POLLRDHUP occurs.");
151
152                 return E_INVALID_OPERATION;
153         }
154
155         SysLog(NID_SHELL, "enter");
156
157         __pAppWidgetFactory = &factory;
158         return E_SUCCESS;
159 }
160
161 result
162 _AppWidgetProviderManagerImpl::SetAppWidgetPopupProviderFactory(IAppWidgetPopupProviderFactory& factory)
163 {
164         result r = ValidateApplicationAttribute();
165         if (IsFailed(r))
166         {
167                 SysLogException(NID_SHELL, E_INVALID_OPERATION, "The application's attribute does not meet the condition to provide AppWidget. 'LifeDuration' and 'UseUi' attribute should be specified in application manifest and it's not allowed that declaring 'AUTO_RESTART' attribute for AppWidget.");
168
169                 r = SendResult(INVALID_INSTANCE, false);
170                 SysTryLog(NID_SHELL, !IsFailed(r), "Because the context for this dynamic box is removed, POLLRDHUP occurs.");
171
172                 return E_INVALID_OPERATION;
173         }
174
175         __pAppWidgetPopupProviderFactory = &factory;
176         return E_SUCCESS;
177 }
178
179 result
180 _AppWidgetProviderManagerImpl::SetAppWidgetTouchEventListener(const String& instanceId, _IAppWidgetTouchEventListener& listener)
181 {
182         return __touchEventListeners.Add(instanceId, &listener);
183 }
184
185 result
186 _AppWidgetProviderManagerImpl::SetAppWidgetPopupEventListener(_IAppWidgetTouchEventListener& listener)
187 {
188          __AppWidgetPopupTouchEventListener = &listener;
189
190          return E_SUCCESS;
191 }
192
193
194 bool
195 _AppWidgetProviderManagerImpl::IsPackagedWithTPK(const AppId& appId)
196 {
197         String packageId = _PackageManagerImpl::GetPackageIdByAppId(appId);
198         PackageInfo* pInfo = _PackageManagerImpl::GetInstance()->GetPackageInfoN(packageId);
199         SysTryReturn(NID_APP, pInfo != null, false, GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()) );
200
201         const _PackageInfoImpl* pPkgInfo = _PackageInfoImpl::GetInstance(pInfo);
202         SysTryReturn(NID_APP, pPkgInfo != null, false, E_SYSTEM, "Invalid PackageInfo instance.");
203
204         static const String TPK_TYPE = L"tpk";
205         if( pPkgInfo && pPkgInfo->GetAppType() == TPK_TYPE )
206         {
207                 SysLog(NID_SHELL, "tpk app.");
208                 return true;
209         }
210         SysLog(NID_SHELL, "not tpk app.");
211         return false;
212 }
213
214 result
215 _AppWidgetProviderManagerImpl::RequestUpdate(const AppId& appId, const String& providerName, const String& argument)
216 {
217         SysLog(NID_SHELL, "Enter.");
218         SysTryReturnResult(NID_SHELL, _Aul::IsInstalled(appId) == true, E_APP_NOT_INSTALLED, "The application(%ls) is not installed.", appId.GetPointer());
219
220         result r = CheckCertificate(Tizen::App::App::GetInstance()->GetAppId(), appId);
221         SysTryReturn(NID_SHELL, !IsFailed(r), r, r, "[%s] VerifyCertification is failed.", GetErrorMessage(r));
222
223 //      if( appId == App::App::GetInstance()->GetAppId())
224 //      {
225 //               //TODO: optimizing for local request
226 //      }
227 //      else
228
229         if( IsPackagedWithTPK(appId) == true)
230         {
231                 _AppWidgetManagerProxy* pProxy = _AppWidgetManagerProxy::GetInstance();
232 //              SysTryReturnResult(NID_SHELL, pProxy, E_SYSTEM, "Failed to get proxy instance!");
233                 SysTryReturnResult(NID_SHELL, pProxy, E_OBJ_NOT_FOUND, "AppWidget service isn't running, because there is no instance for the dynamic box to be updated.");
234
235                 return pProxy->RequestUpdate(appId, providerName, argument);
236         }
237         else
238         {
239                 String providerId;
240                 if( providerName.IsEmpty())
241                 {
242                         providerId = appId;
243                 }
244                 else
245                 {
246                         providerId = appId + "." + providerName;
247                 }
248                 unique_ptr<char[]> pPkgName(_StringConverter::CopyToCharArrayN(providerId));
249                 int ret = livebox_service_trigger_update(pPkgName.get(), null, null, null, 1);
250                 SysTryReturnResult(NID_SHELL, ret != LB_STATUS_ERROR_NOT_EXIST, E_OBJ_NOT_FOUND, "There is no instance for the dynamic box to be updated." );
251                 SysTryReturnResult(NID_SHELL, ret == LB_STATUS_SUCCESS || ret == LB_STATUS_ERROR_CANCEL, E_SYSTEM, "Failed to invoke livebox_service_trigger_update() with reason(%d)", ret);
252
253                 return E_SUCCESS;
254         }
255 }
256
257 result
258 _AppWidgetProviderManagerImpl::RequestUpdateInstance(const String& instanceId, const String& argument)
259 {
260         if(ContainsAppWidget(instanceId))
261         {
262                 AppWidgetProvider* pAppWidgetProvider = null;
263                 __appwidgetProviders.GetValue(instanceId, pAppWidgetProvider);
264
265                 AppWidgetFrame* pAppWidgetFrame = pAppWidgetProvider->GetAppWidgetFrame();
266                 SysTryReturnResult(NID_SHELL, pAppWidgetFrame, E_SYSTEM, "Failed to GetAppWidgetFrame");
267
268                 bool isUpdated = pAppWidgetProvider->OnAppWidgetProviderUpdating(argument);
269                 if (!isUpdated)
270                 {
271                         SysLog(NID_SHELL, "Failed to update.");
272
273                         result r = SendResult(instanceId, false);
274                         SysTryLog(NID_SHELL, !IsFailed(r), "Failed to send the result.");
275
276                         return E_SYSTEM;
277                 }
278         }
279         else
280         {
281                 _AppWidgetManagerProxy* pProxy = _AppWidgetManagerProxy::GetInstance();
282                 SysTryReturnResult(NID_SHELL, pProxy, E_SYSTEM, "Failed to get proxy instance!");
283
284                 return pProxy->RequestUpdateInstance(instanceId, argument);
285         }
286
287         return E_SUCCESS;
288 }
289
290 namespace
291 {
292 int AddAppWidgetCallback(int ret, int pid, void *data)
293 {
294         if( ret != 0)
295         {
296                 SysLog(NID_SHELL, "Error.(%d)", ret);
297         }
298
299         return 0;
300 }
301 }
302
303 bool
304 _AppWidgetProviderManagerImpl::IsSamePackage(const AppId& appId1, const AppId& appId2)
305 {
306         String PackageId1 = _PackageManagerImpl::GetPackageIdByAppId(appId1);
307         String PackageId2 = _PackageManagerImpl::GetPackageIdByAppId(appId2);
308
309         return ( PackageId1 == PackageId2);
310 }
311
312 result
313 _AppWidgetProviderManagerImpl::CheckCertificate(const AppId& localAppId, const AppId& remoteAppId)
314 {
315         if( IsSamePackage( localAppId, remoteAppId))
316         {
317                 return E_SUCCESS;
318         }
319
320         // for FtApp
321         static const String PKGID_FTAPP = L"2s4jm6firv";
322         if( _PackageManagerImpl::GetPackageIdByAppId(localAppId) == PKGID_FTAPP )
323         {
324                 return E_SUCCESS;
325         }
326
327         package_manager_compare_result_type_e res;
328
329         unique_ptr<char[]> pLocalAppId(_StringConverter::CopyToCharArrayN(localAppId));
330         unique_ptr<char[]> pRemoteAppId(_StringConverter::CopyToCharArrayN(remoteAppId));
331
332         int ret = package_manager_compare_app_cert_info(pLocalAppId.get(), pRemoteAppId.get(), &res);
333         SysTryReturnResult(NID_SHELL, ret == 0, E_SYSTEM, "Failed to compare certificate (%s, %s): %d", pLocalAppId.get(), pRemoteAppId.get(), ret);
334         SysTryReturnResult(NID_SHELL, res == PACAKGE_MANAGER_COMPARE_MATCH, E_CERTIFICATE_VERIFICATION_FAILED, "Both applications are not signed with the same certificate: %d", res);
335
336         return E_SUCCESS;
337 }
338
339 result
340 _AppWidgetProviderManagerImpl::AddAppWidget(const AppId& providerAppId, const String& providerName, const String& text, const String& userInfo)
341 {
342         result r = _AccessController::CheckUserPrivilege(_PRV_APPWIDGETPROVIDER_INSTALL);
343         SysTryReturnResult(NID_SHELL, !IsFailed(r), E_PRIVILEGE_DENIED, "The application does not have the privilege to call this method.");
344         SysTryReturnResult(NID_SHELL, _Aul::IsInstalled(providerAppId) == true, E_APP_NOT_INSTALLED, "The application(%ls) is not installed.", providerAppId.GetPointer());
345         SysTryReturnResult(NID_SHELL, !providerName.IsEmpty(), E_OBJ_NOT_FOUND, "The provider name is empty.");
346
347         r = CheckCertificate(Tizen::App::App::GetInstance()->GetAppId(), providerAppId);
348         SysTryReturnResult(NID_SHELL, !IsFailed(r), r, "VerifyCertification failed.");
349
350         String providerId = providerAppId + "." + providerName;
351
352         PackageAppInfo* pPackageInfo = _PackageManagerImpl::GetInstance()->GetPackageAppInfoN(providerAppId);
353         r = GetLastResult();
354         SysTryReturnResult(NID_SHELL, pPackageInfo != null, r, "Propagating.");
355
356         String iconPath = pPackageInfo->GetAppMenuIconPath();
357         delete pPackageInfo;
358
359         unique_ptr<char[]> pProviderId(_StringConverter::CopyToCharArrayN(providerId));
360         unique_ptr<char[]> pName(_StringConverter::CopyToCharArrayN(text));
361         unique_ptr<char[]> pContent(_StringConverter::CopyToCharArrayN(userInfo));
362         unique_ptr<char[]> pIcon(_StringConverter::CopyToCharArrayN(iconPath));
363
364         int ret = add_to_home_livebox(pProviderId.get(), pName.get(), LIVEBOX_TYPE_DEFAULT, pContent.get(), pIcon.get(), -1.0l, true, AddAppWidgetCallback, this);
365         SysTryReturnResult(NID_SHELL, ret != SHORTCUT_ERROR_COMM, E_CONNECTION_FAILED, "Failed to add_to_home_livebox");
366         SysTryReturnResult(NID_SHELL, ret == SHORTCUT_SUCCESS, E_SYSTEM, "Failed to add_to_home_livebox (%s)", strerror(r));
367
368         return E_SUCCESS;
369 }
370
371 bool
372 _AppWidgetProviderManagerImpl::ContainsAppWidget(const String& instanceId) const
373 {
374         bool contains = false;
375         __appwidgetProviders.ContainsKey(instanceId, contains);
376
377         return contains;
378 }
379
380 result
381 _AppWidgetProviderManagerImpl::CreateAppWidget(const String& instanceId, const String& operationId, const IMap* pArgs)
382 {
383         const String* pName = dynamic_cast<const String*>(pArgs->GetValue(ARG_KEY_PROVIDER_NAME));
384         SysTryReturnResult(NID_SHELL, pName, E_FAILURE, "Failed to GetValue(%ls)", ARG_KEY_PROVIDER_NAME.GetPointer() );
385
386         const String* pParam = dynamic_cast<const String*>(pArgs->GetValue(ARG_KEY_USER_INFO));
387         SysTryReturnResult(NID_SHELL, pParam, E_FAILURE, "Failed to GetValue(%ls)", ARG_KEY_USER_INFO.GetPointer() );
388
389         SysSecureLog(NID_SHELL, "id(%ls), name(%ls), param(%ls)", instanceId.GetPointer(), pName->GetPointer(), pParam->GetPointer());
390
391         SysLog(NID_SHELL, "no appwidget instance, creating..");
392
393         int width = 0;
394         const String* pValue = dynamic_cast<const String*>(pArgs->GetValue(ARG_KEY_WIDTH));
395         SysTryReturnResult(NID_SHELL, pValue, E_FAILURE, "Failed to GetValue(%ls)", ARG_KEY_WIDTH.GetPointer() );
396         Integer::Parse(*pValue, width);
397
398         int height = 0;
399         pValue = dynamic_cast<const String*>(pArgs->GetValue(ARG_KEY_HEIGHT));
400         SysTryReturnResult(NID_SHELL, pValue, E_FAILURE, "Failed to GetValue(%ls)", ARG_KEY_HEIGHT.GetPointer() );
401         Integer::Parse(*pValue, height);
402
403         this->CreateAppWidget(*pName, instanceId, width, height, *pParam);
404
405         if(operationId == APPWIDGET_ON_RESIZE)
406         {
407                 SysLog(NID_SHELL, "operation is resize, but appwidget is already recreated with new size, so OnSize won't be called.");
408         }
409
410         return E_SUCCESS;
411 }
412
413 // entry point for AppControl Request
414 void
415 _AppWidgetProviderManagerImpl::OnAppControlRequestReceived(RequestId reqId, const String& operationId, const String* pUri, const String* pMimeType, const IMap* pArgs)
416 {
417         SysAssertf( pArgs, "[E_SYSTEN] pArgs should not be null.");
418         SysAssertf( pArgs->GetCount() > 0, "[E_SYSTEN] pArgs should have one more key-values.");
419
420         SysLog(NID_SHELL, "operationId(%ls), argc(%d)", operationId.GetPointer(), pArgs->GetCount());
421
422         HandleRequest(operationId, pArgs);
423
424         SysLog(NID_SHELL, "Exit");
425 }
426
427 result
428 _AppWidgetProviderManagerImpl::HandleRequest(const String& operationId, const IMap* pArgs)
429 {
430         const String* pInstanceId = dynamic_cast<const String*>(pArgs->GetValue(ARG_KEY_INSTANCE_ID));
431         SysTryReturnResult(NID_SHELL, pInstanceId, E_FAILURE, "Failed to execute GetValue(%ls)", ARG_KEY_INSTANCE_ID.GetPointer());
432
433         if (this->ContainsAppWidget(*pInstanceId) == false)
434         {
435                 SysLog(NID_SHELL, "CreateAppWidget with appcontrol");
436                 result r = CreateAppWidget(*pInstanceId, operationId, pArgs);
437                 SysTryReturnResult(NID_SHELL, !IsFailed(r), E_FAILURE, "Failed to execute CreateAppWidget.");
438         }
439
440         if(operationId.StartsWith(APPWIDGET_POPUP_PREFIX, 0) == true)
441         {
442                 SysTryReturnResult(NID_SHELL, __pAppWidgetPopupProviderFactory, E_FAILURE, "__pAppWidgetPopupProviderFactory is null");
443                 HandleAppWidgetPopupRequest(operationId, pArgs);
444         }
445         else
446         {
447                 _ServiceAppImpl* pServiceAppImpl = _ServiceAppImpl::GetInstance();
448                 SysAssert(pServiceAppImpl);
449                 pServiceAppImpl->ResetLifeDurationTimer();
450
451                 HandleAppWidgetRequest(operationId, pArgs);
452         }
453
454         return E_SUCCESS;
455 }
456
457 result
458 _AppWidgetProviderManagerImpl::HandleAppWidgetRequest(const String& operationId, const IMap* pArgs, bool isConnected)
459 {
460         SysTryReturnResult(NID_SHELL, __pAppWidgetFactory, E_FAILURE, "[E_FAILURE] __pAppWidgetFactory is null");
461
462         if( pArgs == null || pArgs->GetCount() < 3)
463         {
464                 SysAssertf(pArgs, "[E_SYSTEN] pArgs should not be null.");
465                 return E_SYSTEM;
466         }
467
468         SysLog(NID_SHELL, "operationId(%ls), argc(%d)", operationId.GetPointer(), pArgs->GetCount());
469
470         const String* pInstanceId = dynamic_cast<const String*>(pArgs->GetValue(ARG_KEY_INSTANCE_ID));
471         SysTryReturnResult(NID_SHELL, pInstanceId, E_FAILURE, "pId is null.");
472
473         result r = E_SUCCESS;
474
475         if (isConnected)
476         {
477                 if(this->ContainsAppWidget(*pInstanceId) == false)
478                 {
479                         SysLog(NID_SHELL, "CreateAppWidget with ipc");
480                         r = CreateAppWidget(*pInstanceId, operationId, pArgs);
481                         SysTryReturnResult(NID_SHELL, !IsFailed(r), E_FAILURE, "[E_FAILURE] Failed to execute CreateAppWidget.");
482                 }
483         }
484
485         if (operationId == APPWIDGET_ON_RESIZE)
486         {
487                 int width = 0;
488                 int height = 0;
489                 const String* pValue =  dynamic_cast<const String*>(pArgs->GetValue(ARG_KEY_WIDTH));
490                 SysTryReturnResult(NID_SHELL, pValue, E_FAILURE, "Failed to GetValue(%ls)", ARG_KEY_WIDTH.GetPointer() );
491                 Integer::Parse(*pValue, width);
492
493                 pValue =  dynamic_cast<const String*>(pArgs->GetValue(ARG_KEY_HEIGHT));
494                 SysTryReturnResult(NID_SHELL, pValue, E_FAILURE, "Failed to GetValue(%ls)", ARG_KEY_HEIGHT.GetPointer() );
495                 Integer::Parse(*pValue, height);
496
497                 r = this->ResizeAppWidget(*pInstanceId, width, height);
498                 SysTryReturnResult(NID_SHELL, !IsFailed(r), E_FAILURE, "Failed to execute ResizeAppWidget.");
499         }
500         else if (operationId == APPWIDGET_ON_UPDATE)
501         {
502                 int width = 0;
503                 int height = 0;
504                 const String* pValue =  dynamic_cast<const String*>( pArgs->GetValue(ARG_KEY_WIDTH));
505                 SysTryReturnResult(NID_SHELL, pValue, E_FAILURE, "Failed to GetValue(%ls)", ARG_KEY_WIDTH.GetPointer() );
506                 Integer::Parse(*pValue, width);
507
508                 pValue =  dynamic_cast<const String*>(pArgs->GetValue(ARG_KEY_HEIGHT));
509                 SysTryReturnResult(NID_SHELL, pValue, E_FAILURE, "Failed to GetValue(%ls)", ARG_KEY_HEIGHT.GetPointer() );
510                 Integer::Parse(*pValue, height);
511
512                 pValue =  dynamic_cast<const String*>(pArgs->GetValue(ARG_KEY_ARGUMENT));
513                 SysTryReturnResult(NID_SHELL, pValue, E_FAILURE, "Failed to GetValue(%ls)", ARG_KEY_ARGUMENT.GetPointer() );
514
515                 r = this->UpdateAppWidget(*pInstanceId, width, height, *pValue);
516                 SysTryReturnResult(NID_SHELL, !IsFailed(r), E_FAILURE, "Failed to execute UpdateAppWidget.");
517         }
518         else if (operationId == APPWIDGET_ON_REMOVE)
519         {
520                 r = this->RemoveAppWidget(*pInstanceId, true);
521                 SysTryReturnResult(NID_SHELL, !IsFailed(r), E_FAILURE, "Failed to execute RemoveAppWidget.");
522         }
523         else if (operationId == APPWIDGET_ON_TOUCH)
524         {
525                 SysLog(NID_SHELL, "[APPWIDGET_ON_TOUCH] touch events will be delivered after provider is initialized");
526         }
527
528         SendResult(*pInstanceId, true);
529
530         SysLog(NID_SHELL, "Exit");
531         return E_SUCCESS;
532 }
533
534 result
535 _AppWidgetProviderManagerImpl::HandleAppWidgetPopupRequest(const String& operationId, const IMap* pArgs)
536 {
537         SysTryReturnResult(NID_SHELL, __pAppWidgetPopupProviderFactory, E_FAILURE, "[E_FAILURE] __pAppWidgetPopupProviderFactory is null");
538         if( pArgs == null || pArgs->GetCount() < 3)
539         {
540                 SysAssertf(pArgs, "[E_SYSTEN] pArgs should not be null.");
541                 return E_SYSTEM;
542         }
543
544         const String* pInstanceId = dynamic_cast<const String*>(pArgs->GetValue(ARG_KEY_INSTANCE_ID));
545         SysTryReturnResult(NID_SHELL, pInstanceId, E_FAILURE, "Failed to GetValue(%ls)", ARG_KEY_INSTANCE_ID.GetPointer() );
546
547         if (operationId == APPWIDGET_POPUP_ON_CREATE)
548         {
549                 double x = 0;
550                 double y = 0;
551                 int width = 0;
552                 int height = 0;
553
554                 const String* pName = dynamic_cast<const String*>(pArgs->GetValue(ARG_KEY_PROVIDER_NAME));
555                 SysTryReturnResult(NID_SHELL, pName, E_FAILURE, "Failed to GetValue(%ls)", ARG_KEY_PROVIDER_NAME.GetPointer() );
556
557                 const String* pUserInfo = dynamic_cast<const String*>(pArgs->GetValue(ARG_KEY_USER_INFO));
558                 SysTryReturnResult(NID_SHELL, pUserInfo, E_FAILURE, "Failed to GetValue(%ls)", ARG_KEY_USER_INFO.GetPointer() );
559
560                 const String* pValue =  dynamic_cast<const String*>(pArgs->GetValue(ARG_KEY_X));
561                 SysTryReturnResult(NID_SHELL, pValue, E_FAILURE, "Failed to GetValue(%ls)", ARG_KEY_X.GetPointer() );
562                 Double::Parse(*pValue, x);
563
564                 pValue =  dynamic_cast<const String*>(pArgs->GetValue(ARG_KEY_Y));;
565                 SysTryReturnResult(NID_SHELL, pValue, E_FAILURE, "Failed to GetValue(%ls)", ARG_KEY_Y.GetPointer() );
566                 Double::Parse(*pValue, y);
567
568                 pValue =  dynamic_cast<const String*>(pArgs->GetValue(ARG_KEY_WIDTH));
569                 SysTryReturnResult(NID_SHELL, pValue, E_FAILURE, "Failed to GetValue(%ls)", ARG_KEY_WIDTH.GetPointer() );
570                 Integer::Parse(*pValue, width);
571
572                 pValue =  dynamic_cast<const String*>(pArgs->GetValue(ARG_KEY_HEIGHT));;
573                 SysTryReturnResult(NID_SHELL, pValue, E_FAILURE, "Failed to GetValue(%ls)", ARG_KEY_HEIGHT.GetPointer() );
574                 Integer::Parse(*pValue, height);
575
576                 this->CreateAppWidgetPopupProvider(*pInstanceId, *pName, *pUserInfo, x, y, width, height);
577                 return E_SUCCESS;
578         }
579         else if (operationId == APPWIDGET_POPUP_ON_DESTROY)
580         {
581                 this->DestroyAppWidgetPopupProvider(*pInstanceId);
582                 return E_SUCCESS;
583         }
584         else if (operationId == APPWIDGET_POPUP_ON_TOUCH)
585         {
586                 SysAssertf(false, "[Invalid state]");
587         }
588         else
589         {
590                 SysLog(NID_SHELL, "unexpected case(%ls)", operationId.GetPointer() );
591         }
592
593         return E_SUCCESS;
594 }
595
596 result
597 _AppWidgetProviderManagerImpl::CreateAppWidget(const String& name, const String& instanceId, int width, int height, const String& userInfo)
598 {
599         SysSecureLog(NID_SHELL, "instanceId(%ls), w:%d, h:%d, userInfo:%ls", instanceId.GetPointer(), width, height, userInfo.GetPointer());
600         SysTryReturnResult(NID_SHELL, __pAppWidgetFactory, E_FAILURE, "__pAppWidgetFactory should not be null. Please make sure AppWidgetProviderManager::SetAppWidgetProviderFactory() is called in App::OnAppInitializing() and successed.");
601
602         if( ContainsAppWidget(instanceId))
603         {
604                 SysLog(NID_SHELL, "CreateAppWidget invoke is duplicated!!");
605                 RemoveAppWidget(instanceId, false);
606         }
607
608         AppWidgetProvider* pAppWidget = __pAppWidgetFactory->CreateInstance(name, width, height, userInfo);
609         SysTryReturnResult(NID_SHELL, pAppWidget, E_INVALID_OPERATION, "Failed to create an instance for AppWidgetProvider.");
610
611         pAppWidget->Construct(instanceId);
612         __appwidgetProviders.Add(instanceId, pAppWidget);
613
614         bool isCreated = pAppWidget->OnAppWidgetProviderInitializing(width, height, userInfo);
615         if (!isCreated)
616         {
617                 SysLog(NID_SHELL, "Failed to initialize the instance.");
618
619                 result r = SendResult(instanceId, false);
620                 SysTryLog(NID_SHELL, !IsFailed(r), "Failed to send the result.");
621
622                 return E_SYSTEM;
623         }
624
625         SysTryReturnResult(NID_SHELL, pAppWidget->GetAppWidgetFrame(), E_INVALID_OPERATION, "Failed to get the frame.");
626
627         return E_SUCCESS;
628 }
629
630 result
631 _AppWidgetProviderManagerImpl::UpdateAppWidget(const String& instanceId, int width, int height, const String& argument)
632 {
633         SysSecureLog(NID_SHELL, "instanceId(%ls), w:%d, h:%d, argument:%ls", instanceId.GetPointer(), width, height, argument.GetPointer() );
634
635         AppWidgetProvider* pAppWidget = null;
636         __appwidgetProviders.GetValue(instanceId, pAppWidget);
637         SysTryReturnResult(NID_SHELL, pAppWidget, E_SYSTEM, "Can't find the AppWidget provider");
638
639         bool isUpdated = pAppWidget->OnAppWidgetProviderUpdating(argument);
640         if (!isUpdated)
641         {
642                 SysLog(NID_SHELL, "Failed to update.");
643
644                 result r = SendResult(instanceId, false);
645                 SysTryLog(NID_SHELL, !IsFailed(r), "Failed to send the result.");
646                 RemoveAppWidget(instanceId, false);
647
648                 return E_SYSTEM;
649         }
650
651         return E_SUCCESS;
652 }
653
654 result
655 _AppWidgetProviderManagerImpl::ResizeAppWidget(const String& instanceId, int width, int height)
656 {
657         SysSecureLog(NID_SHELL, "instanceId(%ls), w:%d, h:%d", instanceId.GetPointer(), width, height);
658
659         AppWidgetProvider* pAppWidget = null;
660         __appwidgetProviders.GetValue(instanceId, pAppWidget);
661         SysTryReturnResult(NID_SHELL, pAppWidget, E_SYSTEM, "Can't find the AppWidget provider");
662
663         AppWidgetFrame* pAppWidgetFrame = pAppWidget->GetAppWidgetFrame();
664         SysTryReturnResult(NID_SHELL, pAppWidgetFrame, E_SYSTEM, "GetAppWidgetFrame() returns 'null'.");
665
666         return pAppWidgetFrame->SetSize(Dimension(width, height));
667 }
668
669 result
670 _AppWidgetProviderManagerImpl::RemoveAppWidget(const String& instanceId, bool terminateIfFinished)
671 {
672         SysSecureLog(NID_SHELL, "instanceId(%ls), terminateIfFinished(%s)", instanceId.GetPointer(), (terminateIfFinished)? "true":"false" );
673 //      __pAppWidgetEventListener->OnAppWidgetRemoved(instanceId);
674
675         AppWidgetProvider* pAppWidgetProvider = null;
676         __appwidgetProviders.GetValue(instanceId, pAppWidgetProvider);
677         result r = __appwidgetProviders.Remove(instanceId);
678         SysLog(NID_SHELL,       "%s", GetErrorMessage(r) );
679
680         if (pAppWidgetProvider != null)
681         {
682                 pAppWidgetProvider->OnAppWidgetProviderRemoved();
683                 pAppWidgetProvider->OnAppWidgetProviderTerminating();
684                 delete pAppWidgetProvider;
685         }
686
687         SysLog(NID_SHELL,       "(%d) provider(s) remains.", __appwidgetProviders.GetCount() );
688
689         if( terminateIfFinished && this->__appwidgetProviders.GetCount() == 0)
690         {
691                 Tizen::App::App::GetInstance()->Terminate();
692         }
693
694         return E_SUCCESS;
695 }
696
697 result
698 _AppWidgetProviderManagerImpl::CreateAppWidgetPopupProvider(const String& instanceId, const String& providerName, const String& userInfo, double x, double y, int width, int height)
699 {
700         SysSecureLog(NID_SHELL, "instanceId(%ls), providerName(%ls), userInfo(%ls), rect(%f, %f, %d, %d)", instanceId.GetPointer(), providerName.GetPointer(), userInfo.GetPointer(), x, y, width, height );
701         SysTryReturnResult(NID_SHELL, __pAppWidgetPopupProviderFactory, E_FAILURE, "[E_INVALID_OPERATION] __pAppWidgetPopupProviderFactory should not be null");
702
703         AppWidgetPopupProvider* pPd = __pAppWidgetPopupProviderFactory->CreateInstance(providerName, userInfo);
704         __pAppWidgetPopupProvider = pPd;
705
706         __pAppWidgetPopupProvider->Construct(instanceId, x, y);
707         __pAppWidgetPopupProvider->OnAppWidgetPopupProviderInitializing(userInfo);
708
709         AppWidgetPopup* pAppWidgetFrame = pPd->GetAppWidgetPopup();
710         SysTryReturnResult(NID_SHELL, pAppWidgetFrame, E_INVALID_OPERATION, "[E_INVALID_OPERATION] AppWidgetPopup should be set using AppWidgetPopupProvider::SetAppWidgetPopup()");
711
712         _ServiceAppImpl* pServiceAppImpl = _ServiceAppImpl::GetInstance();
713         SysAssert(pServiceAppImpl);
714         pServiceAppImpl->PauseLifeDurationTimer();
715
716         return E_SUCCESS;
717 }
718
719 result
720 _AppWidgetProviderManagerImpl::DestroyAppWidgetPopupProvider(const String& instanceId)
721 {
722         SysSecureLog(NID_SHELL, "instanceId(%ls)", instanceId.GetPointer());
723
724         if( __pAppWidgetPopupProvider )
725         {
726                 __pAppWidgetPopupProvider->OnAppWidgetPopupProviderTerminating();
727                 delete __pAppWidgetPopupProvider;
728                 __pAppWidgetPopupProvider = null;
729         }
730
731         _ServiceAppImpl* pServiceAppImpl = _ServiceAppImpl::GetInstance();
732         SysAssert(pServiceAppImpl);
733         pServiceAppImpl->ResumeLifeDurationTimer();
734
735         return E_SUCCESS;
736 }
737
738 result
739 _AppWidgetProviderManagerImpl::ForwardTouchEvent(const String& instanceId, int eventType, double timeStamp, double x, double y)
740 {
741         SysSecureLog(NID_SHELL, "instanceId(%ls), eventType(%d), timeStamp(%f), x(%f), y(%f)", instanceId.GetPointer(), eventType, timeStamp, x, y);
742
743         _IAppWidgetTouchEventListener* pTouchEventListener = null;
744         __touchEventListeners.GetValue(instanceId, pTouchEventListener);
745         SysTryReturnResult(NID_SHELL, pTouchEventListener, E_INVALID_STATE, "[E_INVALID_STATE]");
746
747         pTouchEventListener->OnTouchEventRecevied(eventType, timeStamp, x, y);
748         /*if( eventType == BUFFER_EVENT_UP)
749         {
750                 _ServiceAppImpl* pServiceAppImpl = _ServiceAppImpl::GetInstance();
751                 SysAssert(pServiceAppImpl);
752                 pServiceAppImpl->ResetLifeDurationTimer();
753         }*/
754
755         return E_SUCCESS;
756 }
757
758 result
759 _AppWidgetProviderManagerImpl::ForwardTouchEventForPD(const String& instanceId, int eventType, double timeStamp, double x, double y)
760 {
761         SysTryReturnResult(NID_SHELL, __AppWidgetPopupTouchEventListener, E_INVALID_STATE, "[E_INVALID_STATE]");
762         __AppWidgetPopupTouchEventListener->OnTouchEventRecevied(eventType, timeStamp, x, y);
763
764         return E_SUCCESS;
765 }
766 //////////////////////////////////////////////////////////////////////////
767 //              buffer APIs
768 //////////////////////////////////////////////////////////////////////////
769
770 result
771 _AppWidgetProviderManagerImpl::RequestSharedMemoryId(const String& instanceId, int width, int height, int& shmId)
772 {
773         _AppWidgetManagerProxy* pProxy = _AppWidgetManagerProxy::GetInstance();
774         SysTryReturnResult(NID_SHELL, pProxy, E_SYSTEM, "Failed to get proxy instance!");
775
776         return pProxy->RequestSharedMemoryId(instanceId, width, height, shmId);
777 }
778
779 result
780 _AppWidgetProviderManagerImpl::RequestSharedMemoryIdForPD(const String& instanceId, int width, int height, int& shmId)
781 {
782         _AppWidgetManagerProxy* pProxy = _AppWidgetManagerProxy::GetInstance();
783         SysTryReturnResult(NID_SHELL, pProxy, E_SYSTEM, "Failed to get proxy instance!");
784
785         return pProxy->RequestSharedMemoryIdForPD(instanceId, width, height, shmId);
786 }
787
788 result
789 _AppWidgetProviderManagerImpl::RequestReleaseSharedMemory(const String& instanceId)
790 {
791         _AppWidgetManagerProxy* pProxy = _AppWidgetManagerProxy::GetInstance();
792         SysTryReturnResult(NID_SHELL, pProxy, E_SYSTEM, "Failed to get proxy instance!");
793
794         return pProxy->RequestReleaseSharedMemory(instanceId);
795 }
796
797 result
798 _AppWidgetProviderManagerImpl::RequestReleaseSharedMemoryForPD(const String& instanceId)
799 {
800         _AppWidgetManagerProxy* pProxy = _AppWidgetManagerProxy::GetInstance();
801         SysTryReturnResult(NID_SHELL, pProxy, E_SYSTEM, "Failed to get proxy instance!");
802
803         return pProxy->RequestReleaseSharedMemoryForPD(instanceId);
804 }
805
806 result
807 _AppWidgetProviderManagerImpl::RequestSyncSharedMemory(const String& instanceId, int width, int height)
808 {
809         _AppWidgetManagerProxy* pProxy = _AppWidgetManagerProxy::GetInstance();
810         SysTryReturnResult(NID_SHELL, pProxy, E_SYSTEM, "Failed to get proxy instance!");
811
812         return pProxy->RequestSyncSharedMemory(instanceId, width, height);
813 }
814
815 result
816 _AppWidgetProviderManagerImpl::RequestSyncSharedMemoryForPD(const String& instanceId)
817 {
818         _AppWidgetManagerProxy* pProxy = _AppWidgetManagerProxy::GetInstance();
819         SysTryReturnResult(NID_SHELL, pProxy, E_SYSTEM, "Failed to get proxy instance!");
820
821         return pProxy->RequestSyncSharedMemoryForPD(instanceId);
822 }
823
824 result
825 _AppWidgetProviderManagerImpl::SendResult(const String& instanceId, bool isSucceeded)
826 {
827         _AppWidgetManagerProxy* pProxy = _AppWidgetManagerProxy::GetInstance();
828         SysTryReturnResult(NID_SHELL, pProxy, E_SYSTEM, "Failed to get proxy instance!");
829
830         return pProxy->SendResult(instanceId, isSucceeded);
831 }
832
833 result
834 _AppWidgetProviderManagerImpl::SendAccessStatus(const String& instanceId, int accessStatus)
835 {
836         _AppWidgetManagerProxy* pProxy = _AppWidgetManagerProxy::GetInstance();
837         SysTryReturnResult(NID_SHELL, pProxy, E_SYSTEM, "Failed to get proxy instance!");
838
839         return pProxy->SendAccessStatus(instanceId, accessStatus);
840 }
841
842 void
843 _AppWidgetProviderManagerImpl::OnApplicationTerminated(const AppId& appId, int pid)
844 {
845         ///////////////////////////////////////////////
846         // This listener is called when life duration is expired
847         ///////////////////////////////////////////////
848
849         AppWidgetProvider* pAppWidgetProvider;
850         unique_ptr<IMapEnumeratorT< String, Tizen::Shell::AppWidgetProvider*> > pMapEnum(__appwidgetProviders.GetMapEnumeratorN() );
851         while (pMapEnum->MoveNext() == E_SUCCESS)
852         {
853                 pAppWidgetProvider = null;
854
855                 pMapEnum->GetValue(pAppWidgetProvider);
856                 if( pAppWidgetProvider )
857                 {
858                         pAppWidgetProvider->OnAppWidgetProviderTerminating();
859                         delete pAppWidgetProvider;
860                 }
861         }
862         __appwidgetProviders.RemoveAll();
863 }
864
865 result
866 _AppWidgetProviderManagerImpl::ValidateApplicationAttribute(void)
867 {
868         const wchar_t USE_UI_KEY[] = L"UseUi";
869         const wchar_t USE_UI_VAL_TRUE[] = L"True";
870         const wchar_t LIFE_DURATION_KEY[] = L"LifeDuration";
871         const wchar_t AUTO_RESTART_KEY[] = L"AutoRestart";
872         const int LIFE_DURATION_MIN = 30000;
873
874         static result res = E_UNKNOWN;
875         if(res != E_UNKNOWN )
876         {
877                 return res;
878         }
879
880         res = E_SYSTEM;
881         unique_ptr<HashMapT<String, _AppFeatureInfoImpl*> > pInfo(_PackageManagerImpl::GetInstance()->GetPackageAppFeatureMapN(_AppInfo::GetPackageId(), _AppInfo::GetAppExecutableName()) );
882         SysTryReturnResult(NID_SHELL, pInfo.get(), E_SYSTEM, "Failed to invoke _PackageManagerImpl::GetPackageAppFeatureMapN()");
883
884         _AppFeatureInfoImpl* pFeature = null;
885
886         res = E_INVALID_OPERATION;
887         // UseUi
888         result r = pInfo->GetValue(USE_UI_KEY, pFeature);
889         SysTryReturnResult(NID_SHELL, !IsFailed(r), E_INVALID_OPERATION, "Can't find %ls attribute for the ServiceApp in package information.", USE_UI_KEY );
890
891         const String& useUi = pFeature->GetValue();
892         SysTryReturnResult(NID_SHELL, useUi == USE_UI_VAL_TRUE, E_INVALID_OPERATION, "%ls attribute value should be '%ls' to be an application that providing AppWidget, but value is %ls", USE_UI_KEY, USE_UI_VAL_TRUE, useUi.GetPointer() );
893
894         // LifeDuration
895         r = pInfo->GetValue(LIFE_DURATION_KEY, pFeature);
896         SysTryReturnResult(NID_SHELL, !IsFailed(r), E_INVALID_OPERATION, "Can't find %ls attribute for the ServiceApp in package information.", LIFE_DURATION_KEY );
897
898         const String& lifeDurationValue = pFeature->GetValue();
899         int lifeDuration = 0;
900         r = Integer::Parse(lifeDurationValue, lifeDuration);
901         SysTryReturnResult(NID_SHELL, !IsFailed(r), E_INVALID_OPERATION, "Failed to parse %ls attribute for the ServiceApp in package information.", LIFE_DURATION_KEY );
902         //SysTryReturnResult(NID_SHELL, lifeDuration <= LIFE_DURATION_MIN, E_INVALID_OPERATION, "%ls attribute value should be less than '%d' to be an application that providing AppWidget, but value is %d", LIFE_DURATION_KEY, LIFE_DURATION_MIN, lifeDuration );
903
904         // AutoRestart
905         r = pInfo->GetValue(AUTO_RESTART_KEY, pFeature);
906         if (!IsFailed(r))
907         {
908                 String autoRestart = pFeature->GetValue();
909                 autoRestart.ToLowerCase();
910                 SysTryReturnResult(NID_SHELL, autoRestart != "true", E_INVALID_OPERATION, "It's not allowed that declaring 'AUTO_RESTART' attribute for AppWidget.");
911         }
912
913         _DeleteCollectionMapValue<String, _AppFeatureInfoImpl>(*pInfo);
914
915         res = E_SUCCESS;
916         return res;
917 }
918
919 }} // Tizen::Shell