2 // Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
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
8 // http://floralicense.org/license/
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.
18 * @file FShell_AppWidgetManagerImpl.cpp
19 * @brief This is the implementation for the _AppWidgetManagerImpl class.
22 #include <unique_ptr.h>
25 #include <package_manager.h>
27 #include <livebox-errno.h>
28 #include <provider_buffer.h>
29 #include <livebox-service.h>
31 #include <FBaseSysLog.h>
34 #include <FGrpDimension.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>
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>
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"
59 namespace Tizen { namespace Shell
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;
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";
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";
93 _AppWidgetProviderManagerImpl::_AppWidgetProviderManagerImpl()
94 :__pAppWidgetFactory(null)
95 ,__pAppWidgetPopupProviderFactory(null)
96 ,__pAppWidgetPopupProvider(null)
97 ,__AppWidgetPopupTouchEventListener(null)
99 SysLog(NID_SHELL, "");
102 _AppWidgetProviderManagerImpl::~_AppWidgetProviderManagerImpl()
104 SysLog(NID_SHELL, "");
107 _AppWidgetProviderManagerImpl*
108 _AppWidgetProviderManagerImpl::GetInstance()
110 static _AppWidgetProviderManagerImpl* __pAppWidgetManagerImpl = null;
111 if( __pAppWidgetManagerImpl == null)
113 __pAppWidgetManagerImpl = new (nothrow)_AppWidgetProviderManagerImpl;
114 SysTryReturn(NID_SHELL, __pAppWidgetManagerImpl, null, E_OUT_OF_MEMORY, "Allocating new _AppWidgetManagerProxy failed.");
116 result r = __pAppWidgetManagerImpl->Construct();
117 SysTryReturn(NID_SHELL, !IsFailed(r), null, r, "[%s] Propagating.", GetErrorMessage(r));
119 return __pAppWidgetManagerImpl;
123 _AppWidgetProviderManagerImpl::Construct()
125 SysLog(NID_SHELL, "Enter.");
127 __appwidgetProviders.Construct();
128 __touchEventListeners.Construct();
130 _AppImpl::GetInstance()->SetAppControlProviderInternalEventListener(this);
131 _ServiceAppImpl* pServiceAppImpl = _ServiceAppImpl::GetInstance();
134 pServiceAppImpl->SetAppTerminatingInternalEventListener(this);
137 SysLog(NID_SHELL, "Exit.");
142 _AppWidgetProviderManagerImpl::SetAppWidgetProviderFactory(IAppWidgetProviderFactory& factory)
144 result r = ValidateApplicationAttribute();
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.");
149 r = SendResult(INVALID_INSTANCE, false);
150 SysTryLog(NID_SHELL, !IsFailed(r), "Because the context for this dynamic box is removed, POLLRDHUP occurs.");
152 return E_INVALID_OPERATION;
155 SysLog(NID_SHELL, "enter");
157 __pAppWidgetFactory = &factory;
162 _AppWidgetProviderManagerImpl::SetAppWidgetPopupProviderFactory(IAppWidgetPopupProviderFactory& factory)
164 result r = ValidateApplicationAttribute();
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.");
169 r = SendResult(INVALID_INSTANCE, false);
170 SysTryLog(NID_SHELL, !IsFailed(r), "Because the context for this dynamic box is removed, POLLRDHUP occurs.");
172 return E_INVALID_OPERATION;
175 __pAppWidgetPopupProviderFactory = &factory;
180 _AppWidgetProviderManagerImpl::SetAppWidgetTouchEventListener(const String& instanceId, _IAppWidgetTouchEventListener& listener)
182 return __touchEventListeners.Add(instanceId, &listener);
186 _AppWidgetProviderManagerImpl::SetAppWidgetPopupEventListener(_IAppWidgetTouchEventListener& listener)
188 __AppWidgetPopupTouchEventListener = &listener;
195 _AppWidgetProviderManagerImpl::IsPackagedWithTPK(const AppId& appId)
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()) );
201 const _PackageInfoImpl* pPkgInfo = _PackageInfoImpl::GetInstance(pInfo);
202 SysTryReturn(NID_APP, pPkgInfo != null, false, E_SYSTEM, "Invalid PackageInfo instance.");
204 static const String TPK_TYPE = L"tpk";
205 if( pPkgInfo && pPkgInfo->GetAppType() == TPK_TYPE )
207 SysLog(NID_SHELL, "tpk app.");
210 SysLog(NID_SHELL, "not tpk app.");
215 _AppWidgetProviderManagerImpl::RequestUpdate(const AppId& appId, const String& providerName, const String& argument)
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());
220 result r = CheckCertificate(Tizen::App::App::GetInstance()->GetAppId(), appId);
221 SysTryReturn(NID_SHELL, !IsFailed(r), r, r, "[%s] VerifyCertification is failed.", GetErrorMessage(r));
223 // if( appId == App::App::GetInstance()->GetAppId())
225 // //TODO: optimizing for local request
229 if( IsPackagedWithTPK(appId) == true)
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.");
235 return pProxy->RequestUpdate(appId, providerName, argument);
240 if( providerName.IsEmpty())
246 providerId = appId + "." + providerName;
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);
258 _AppWidgetProviderManagerImpl::RequestUpdateInstance(const String& instanceId, const String& argument)
260 if(ContainsAppWidget(instanceId))
262 AppWidgetProvider* pAppWidgetProvider = null;
263 __appwidgetProviders.GetValue(instanceId, pAppWidgetProvider);
265 AppWidgetFrame* pAppWidgetFrame = pAppWidgetProvider->GetAppWidgetFrame();
266 SysTryReturnResult(NID_SHELL, pAppWidgetFrame, E_SYSTEM, "Failed to GetAppWidgetFrame");
268 bool isUpdated = pAppWidgetProvider->OnAppWidgetProviderUpdating(argument);
271 SysLog(NID_SHELL, "Failed to update.");
273 result r = SendResult(instanceId, false);
274 SysTryLog(NID_SHELL, !IsFailed(r), "Failed to send the result.");
281 _AppWidgetManagerProxy* pProxy = _AppWidgetManagerProxy::GetInstance();
282 SysTryReturnResult(NID_SHELL, pProxy, E_SYSTEM, "Failed to get proxy instance!");
284 return pProxy->RequestUpdateInstance(instanceId, argument);
292 int AddAppWidgetCallback(int ret, int pid, void *data)
296 SysLog(NID_SHELL, "Error.(%d)", ret);
304 _AppWidgetProviderManagerImpl::IsSamePackage(const AppId& appId1, const AppId& appId2)
306 String PackageId1 = _PackageManagerImpl::GetPackageIdByAppId(appId1);
307 String PackageId2 = _PackageManagerImpl::GetPackageIdByAppId(appId2);
309 return ( PackageId1 == PackageId2);
313 _AppWidgetProviderManagerImpl::CheckCertificate(const AppId& localAppId, const AppId& remoteAppId)
315 if( IsSamePackage( localAppId, remoteAppId))
321 static const String PKGID_FTAPP = L"2s4jm6firv";
322 if( _PackageManagerImpl::GetPackageIdByAppId(localAppId) == PKGID_FTAPP )
327 package_manager_compare_result_type_e res;
329 unique_ptr<char[]> pLocalAppId(_StringConverter::CopyToCharArrayN(localAppId));
330 unique_ptr<char[]> pRemoteAppId(_StringConverter::CopyToCharArrayN(remoteAppId));
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);
340 _AppWidgetProviderManagerImpl::AddAppWidget(const AppId& providerAppId, const String& providerName, const String& text, const String& userInfo)
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.");
347 r = CheckCertificate(Tizen::App::App::GetInstance()->GetAppId(), providerAppId);
348 SysTryReturnResult(NID_SHELL, !IsFailed(r), r, "VerifyCertification failed.");
350 String providerId = providerAppId + "." + providerName;
352 PackageAppInfo* pPackageInfo = _PackageManagerImpl::GetInstance()->GetPackageAppInfoN(providerAppId);
354 SysTryReturnResult(NID_SHELL, pPackageInfo != null, r, "Propagating.");
356 String iconPath = pPackageInfo->GetAppMenuIconPath();
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));
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));
372 _AppWidgetProviderManagerImpl::ContainsAppWidget(const String& instanceId) const
374 bool contains = false;
375 __appwidgetProviders.ContainsKey(instanceId, contains);
381 _AppWidgetProviderManagerImpl::CreateAppWidget(const String& instanceId, const String& operationId, const IMap* pArgs)
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() );
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() );
389 SysSecureLog(NID_SHELL, "id(%ls), name(%ls), param(%ls)", instanceId.GetPointer(), pName->GetPointer(), pParam->GetPointer());
391 SysLog(NID_SHELL, "no appwidget instance, creating..");
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);
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);
403 this->CreateAppWidget(*pName, instanceId, width, height, *pParam);
405 if(operationId == APPWIDGET_ON_RESIZE)
407 SysLog(NID_SHELL, "operation is resize, but appwidget is already recreated with new size, so OnSize won't be called.");
413 // entry point for AppControl Request
415 _AppWidgetProviderManagerImpl::OnAppControlRequestReceived(RequestId reqId, const String& operationId, const String* pUri, const String* pMimeType, const IMap* pArgs)
417 SysAssertf( pArgs, "[E_SYSTEN] pArgs should not be null.");
418 SysAssertf( pArgs->GetCount() > 0, "[E_SYSTEN] pArgs should have one more key-values.");
420 SysLog(NID_SHELL, "operationId(%ls), argc(%d)", operationId.GetPointer(), pArgs->GetCount());
422 HandleRequest(operationId, pArgs);
424 SysLog(NID_SHELL, "Exit");
428 _AppWidgetProviderManagerImpl::HandleRequest(const String& operationId, const IMap* pArgs)
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());
433 if (this->ContainsAppWidget(*pInstanceId) == false)
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.");
440 if(operationId.StartsWith(APPWIDGET_POPUP_PREFIX, 0) == true)
442 SysTryReturnResult(NID_SHELL, __pAppWidgetPopupProviderFactory, E_FAILURE, "__pAppWidgetPopupProviderFactory is null");
443 HandleAppWidgetPopupRequest(operationId, pArgs);
447 _ServiceAppImpl* pServiceAppImpl = _ServiceAppImpl::GetInstance();
448 SysAssert(pServiceAppImpl);
449 pServiceAppImpl->ResetLifeDurationTimer();
451 HandleAppWidgetRequest(operationId, pArgs);
458 _AppWidgetProviderManagerImpl::HandleAppWidgetRequest(const String& operationId, const IMap* pArgs, bool isConnected)
460 SysTryReturnResult(NID_SHELL, __pAppWidgetFactory, E_FAILURE, "[E_FAILURE] __pAppWidgetFactory is null");
462 if( pArgs == null || pArgs->GetCount() < 3)
464 SysAssertf(pArgs, "[E_SYSTEN] pArgs should not be null.");
468 SysLog(NID_SHELL, "operationId(%ls), argc(%d)", operationId.GetPointer(), pArgs->GetCount());
470 const String* pInstanceId = dynamic_cast<const String*>(pArgs->GetValue(ARG_KEY_INSTANCE_ID));
471 SysTryReturnResult(NID_SHELL, pInstanceId, E_FAILURE, "pId is null.");
473 result r = E_SUCCESS;
477 if(this->ContainsAppWidget(*pInstanceId) == false)
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.");
485 if (operationId == APPWIDGET_ON_RESIZE)
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);
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);
497 r = this->ResizeAppWidget(*pInstanceId, width, height);
498 SysTryReturnResult(NID_SHELL, !IsFailed(r), E_FAILURE, "Failed to execute ResizeAppWidget.");
500 else if (operationId == APPWIDGET_ON_UPDATE)
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);
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);
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() );
515 r = this->UpdateAppWidget(*pInstanceId, width, height, *pValue);
516 SysTryReturnResult(NID_SHELL, !IsFailed(r), E_FAILURE, "Failed to execute UpdateAppWidget.");
518 else if (operationId == APPWIDGET_ON_REMOVE)
520 r = this->RemoveAppWidget(*pInstanceId, true);
521 SysTryReturnResult(NID_SHELL, !IsFailed(r), E_FAILURE, "Failed to execute RemoveAppWidget.");
523 else if (operationId == APPWIDGET_ON_TOUCH)
525 SysLog(NID_SHELL, "[APPWIDGET_ON_TOUCH] touch events will be delivered after provider is initialized");
528 SendResult(*pInstanceId, true);
530 SysLog(NID_SHELL, "Exit");
535 _AppWidgetProviderManagerImpl::HandleAppWidgetPopupRequest(const String& operationId, const IMap* pArgs)
537 SysTryReturnResult(NID_SHELL, __pAppWidgetPopupProviderFactory, E_FAILURE, "[E_FAILURE] __pAppWidgetPopupProviderFactory is null");
538 if( pArgs == null || pArgs->GetCount() < 3)
540 SysAssertf(pArgs, "[E_SYSTEN] pArgs should not be null.");
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() );
547 if (operationId == APPWIDGET_POPUP_ON_CREATE)
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() );
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() );
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);
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);
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);
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);
576 this->CreateAppWidgetPopupProvider(*pInstanceId, *pName, *pUserInfo, x, y, width, height);
579 else if (operationId == APPWIDGET_POPUP_ON_DESTROY)
581 this->DestroyAppWidgetPopupProvider(*pInstanceId);
584 else if (operationId == APPWIDGET_POPUP_ON_TOUCH)
586 SysAssertf(false, "[Invalid state]");
590 SysLog(NID_SHELL, "unexpected case(%ls)", operationId.GetPointer() );
597 _AppWidgetProviderManagerImpl::CreateAppWidget(const String& name, const String& instanceId, int width, int height, const String& userInfo)
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.");
602 if( ContainsAppWidget(instanceId))
604 SysLog(NID_SHELL, "CreateAppWidget invoke is duplicated!!");
605 RemoveAppWidget(instanceId, false);
608 AppWidgetProvider* pAppWidget = __pAppWidgetFactory->CreateInstance(name, width, height, userInfo);
609 SysTryReturnResult(NID_SHELL, pAppWidget, E_INVALID_OPERATION, "Failed to create an instance for AppWidgetProvider.");
611 pAppWidget->Construct(instanceId);
612 __appwidgetProviders.Add(instanceId, pAppWidget);
614 bool isCreated = pAppWidget->OnAppWidgetProviderInitializing(width, height, userInfo);
617 SysLog(NID_SHELL, "Failed to initialize the instance.");
619 result r = SendResult(instanceId, false);
620 SysTryLog(NID_SHELL, !IsFailed(r), "Failed to send the result.");
625 SysTryReturnResult(NID_SHELL, pAppWidget->GetAppWidgetFrame(), E_INVALID_OPERATION, "Failed to get the frame.");
631 _AppWidgetProviderManagerImpl::UpdateAppWidget(const String& instanceId, int width, int height, const String& argument)
633 SysSecureLog(NID_SHELL, "instanceId(%ls), w:%d, h:%d, argument:%ls", instanceId.GetPointer(), width, height, argument.GetPointer() );
635 AppWidgetProvider* pAppWidget = null;
636 __appwidgetProviders.GetValue(instanceId, pAppWidget);
637 SysTryReturnResult(NID_SHELL, pAppWidget, E_SYSTEM, "Can't find the AppWidget provider");
639 bool isUpdated = pAppWidget->OnAppWidgetProviderUpdating(argument);
642 SysLog(NID_SHELL, "Failed to update.");
644 result r = SendResult(instanceId, false);
645 SysTryLog(NID_SHELL, !IsFailed(r), "Failed to send the result.");
646 RemoveAppWidget(instanceId, false);
655 _AppWidgetProviderManagerImpl::ResizeAppWidget(const String& instanceId, int width, int height)
657 SysSecureLog(NID_SHELL, "instanceId(%ls), w:%d, h:%d", instanceId.GetPointer(), width, height);
659 AppWidgetProvider* pAppWidget = null;
660 __appwidgetProviders.GetValue(instanceId, pAppWidget);
661 SysTryReturnResult(NID_SHELL, pAppWidget, E_SYSTEM, "Can't find the AppWidget provider");
663 AppWidgetFrame* pAppWidgetFrame = pAppWidget->GetAppWidgetFrame();
664 SysTryReturnResult(NID_SHELL, pAppWidgetFrame, E_SYSTEM, "GetAppWidgetFrame() returns 'null'.");
666 return pAppWidgetFrame->SetSize(Dimension(width, height));
670 _AppWidgetProviderManagerImpl::RemoveAppWidget(const String& instanceId, bool terminateIfFinished)
672 SysSecureLog(NID_SHELL, "instanceId(%ls), terminateIfFinished(%s)", instanceId.GetPointer(), (terminateIfFinished)? "true":"false" );
673 // __pAppWidgetEventListener->OnAppWidgetRemoved(instanceId);
675 AppWidgetProvider* pAppWidgetProvider = null;
676 __appwidgetProviders.GetValue(instanceId, pAppWidgetProvider);
677 result r = __appwidgetProviders.Remove(instanceId);
678 SysLog(NID_SHELL, "%s", GetErrorMessage(r) );
680 if (pAppWidgetProvider != null)
682 pAppWidgetProvider->OnAppWidgetProviderRemoved();
683 pAppWidgetProvider->OnAppWidgetProviderTerminating();
684 delete pAppWidgetProvider;
687 SysLog(NID_SHELL, "(%d) provider(s) remains.", __appwidgetProviders.GetCount() );
689 if( terminateIfFinished && this->__appwidgetProviders.GetCount() == 0)
691 Tizen::App::App::GetInstance()->Terminate();
698 _AppWidgetProviderManagerImpl::CreateAppWidgetPopupProvider(const String& instanceId, const String& providerName, const String& userInfo, double x, double y, int width, int height)
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");
703 AppWidgetPopupProvider* pPd = __pAppWidgetPopupProviderFactory->CreateInstance(providerName, userInfo);
704 __pAppWidgetPopupProvider = pPd;
706 __pAppWidgetPopupProvider->Construct(instanceId, x, y);
707 __pAppWidgetPopupProvider->OnAppWidgetPopupProviderInitializing(userInfo);
709 AppWidgetPopup* pAppWidgetFrame = pPd->GetAppWidgetPopup();
710 SysTryReturnResult(NID_SHELL, pAppWidgetFrame, E_INVALID_OPERATION, "[E_INVALID_OPERATION] AppWidgetPopup should be set using AppWidgetPopupProvider::SetAppWidgetPopup()");
712 _ServiceAppImpl* pServiceAppImpl = _ServiceAppImpl::GetInstance();
713 SysAssert(pServiceAppImpl);
714 pServiceAppImpl->PauseLifeDurationTimer();
720 _AppWidgetProviderManagerImpl::DestroyAppWidgetPopupProvider(const String& instanceId)
722 SysSecureLog(NID_SHELL, "instanceId(%ls)", instanceId.GetPointer());
724 if( __pAppWidgetPopupProvider )
726 __pAppWidgetPopupProvider->OnAppWidgetPopupProviderTerminating();
727 delete __pAppWidgetPopupProvider;
728 __pAppWidgetPopupProvider = null;
731 _ServiceAppImpl* pServiceAppImpl = _ServiceAppImpl::GetInstance();
732 SysAssert(pServiceAppImpl);
733 pServiceAppImpl->ResumeLifeDurationTimer();
739 _AppWidgetProviderManagerImpl::ForwardTouchEvent(const String& instanceId, int eventType, double timeStamp, double x, double y)
741 SysSecureLog(NID_SHELL, "instanceId(%ls), eventType(%d), timeStamp(%f), x(%f), y(%f)", instanceId.GetPointer(), eventType, timeStamp, x, y);
743 _IAppWidgetTouchEventListener* pTouchEventListener = null;
744 __touchEventListeners.GetValue(instanceId, pTouchEventListener);
745 SysTryReturnResult(NID_SHELL, pTouchEventListener, E_INVALID_STATE, "[E_INVALID_STATE]");
747 pTouchEventListener->OnTouchEventRecevied(eventType, timeStamp, x, y);
748 /*if( eventType == BUFFER_EVENT_UP)
750 _ServiceAppImpl* pServiceAppImpl = _ServiceAppImpl::GetInstance();
751 SysAssert(pServiceAppImpl);
752 pServiceAppImpl->ResetLifeDurationTimer();
759 _AppWidgetProviderManagerImpl::ForwardTouchEventForPD(const String& instanceId, int eventType, double timeStamp, double x, double y)
761 SysTryReturnResult(NID_SHELL, __AppWidgetPopupTouchEventListener, E_INVALID_STATE, "[E_INVALID_STATE]");
762 __AppWidgetPopupTouchEventListener->OnTouchEventRecevied(eventType, timeStamp, x, y);
766 //////////////////////////////////////////////////////////////////////////
768 //////////////////////////////////////////////////////////////////////////
771 _AppWidgetProviderManagerImpl::RequestSharedMemoryId(const String& instanceId, int width, int height, int& shmId)
773 _AppWidgetManagerProxy* pProxy = _AppWidgetManagerProxy::GetInstance();
774 SysTryReturnResult(NID_SHELL, pProxy, E_SYSTEM, "Failed to get proxy instance!");
776 return pProxy->RequestSharedMemoryId(instanceId, width, height, shmId);
780 _AppWidgetProviderManagerImpl::RequestSharedMemoryIdForPD(const String& instanceId, int width, int height, int& shmId)
782 _AppWidgetManagerProxy* pProxy = _AppWidgetManagerProxy::GetInstance();
783 SysTryReturnResult(NID_SHELL, pProxy, E_SYSTEM, "Failed to get proxy instance!");
785 return pProxy->RequestSharedMemoryIdForPD(instanceId, width, height, shmId);
789 _AppWidgetProviderManagerImpl::RequestReleaseSharedMemory(const String& instanceId)
791 _AppWidgetManagerProxy* pProxy = _AppWidgetManagerProxy::GetInstance();
792 SysTryReturnResult(NID_SHELL, pProxy, E_SYSTEM, "Failed to get proxy instance!");
794 return pProxy->RequestReleaseSharedMemory(instanceId);
798 _AppWidgetProviderManagerImpl::RequestReleaseSharedMemoryForPD(const String& instanceId)
800 _AppWidgetManagerProxy* pProxy = _AppWidgetManagerProxy::GetInstance();
801 SysTryReturnResult(NID_SHELL, pProxy, E_SYSTEM, "Failed to get proxy instance!");
803 return pProxy->RequestReleaseSharedMemoryForPD(instanceId);
807 _AppWidgetProviderManagerImpl::RequestSyncSharedMemory(const String& instanceId, int width, int height)
809 _AppWidgetManagerProxy* pProxy = _AppWidgetManagerProxy::GetInstance();
810 SysTryReturnResult(NID_SHELL, pProxy, E_SYSTEM, "Failed to get proxy instance!");
812 return pProxy->RequestSyncSharedMemory(instanceId, width, height);
816 _AppWidgetProviderManagerImpl::RequestSyncSharedMemoryForPD(const String& instanceId)
818 _AppWidgetManagerProxy* pProxy = _AppWidgetManagerProxy::GetInstance();
819 SysTryReturnResult(NID_SHELL, pProxy, E_SYSTEM, "Failed to get proxy instance!");
821 return pProxy->RequestSyncSharedMemoryForPD(instanceId);
825 _AppWidgetProviderManagerImpl::SendResult(const String& instanceId, bool isSucceeded)
827 _AppWidgetManagerProxy* pProxy = _AppWidgetManagerProxy::GetInstance();
828 SysTryReturnResult(NID_SHELL, pProxy, E_SYSTEM, "Failed to get proxy instance!");
830 return pProxy->SendResult(instanceId, isSucceeded);
834 _AppWidgetProviderManagerImpl::SendAccessStatus(const String& instanceId, int accessStatus)
836 _AppWidgetManagerProxy* pProxy = _AppWidgetManagerProxy::GetInstance();
837 SysTryReturnResult(NID_SHELL, pProxy, E_SYSTEM, "Failed to get proxy instance!");
839 return pProxy->SendAccessStatus(instanceId, accessStatus);
843 _AppWidgetProviderManagerImpl::OnApplicationTerminated(const AppId& appId, int pid)
845 ///////////////////////////////////////////////
846 // This listener is called when life duration is expired
847 ///////////////////////////////////////////////
849 AppWidgetProvider* pAppWidgetProvider;
850 unique_ptr<IMapEnumeratorT< String, Tizen::Shell::AppWidgetProvider*> > pMapEnum(__appwidgetProviders.GetMapEnumeratorN() );
851 while (pMapEnum->MoveNext() == E_SUCCESS)
853 pAppWidgetProvider = null;
855 pMapEnum->GetValue(pAppWidgetProvider);
856 if( pAppWidgetProvider )
858 pAppWidgetProvider->OnAppWidgetProviderTerminating();
859 delete pAppWidgetProvider;
862 __appwidgetProviders.RemoveAll();
866 _AppWidgetProviderManagerImpl::ValidateApplicationAttribute(void)
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;
874 static result res = E_UNKNOWN;
875 if(res != E_UNKNOWN )
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()");
884 _AppFeatureInfoImpl* pFeature = null;
886 res = E_INVALID_OPERATION;
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 );
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() );
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 );
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 );
905 r = pInfo->GetValue(AUTO_RESTART_KEY, pFeature);
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.");
913 _DeleteCollectionMapValue<String, _AppFeatureInfoImpl>(*pInfo);