From: jungmin76.park Date: Thu, 18 Apr 2013 04:34:28 +0000 (+0900) Subject: implement LifeDuration feature, add size check for public signatured app X-Git-Tag: accepted/tizen_2.1/20130425.034720~13 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=77158433077bb8363e5e66bac729e37980b70af5;p=platform%2Fframework%2Fnative%2Fshell.git implement LifeDuration feature, add size check for public signatured app Change-Id: Ic8711efb9053ab22734d4c4218a4bb0351ef17e4 Signed-off-by: jungmin76.park --- diff --git a/src/FShell_AppWidgetProviderInfoImpl.cpp b/src/FShell_AppWidgetProviderInfoImpl.cpp index 70cf0a4..fd9ef39 100644 --- a/src/FShell_AppWidgetProviderInfoImpl.cpp +++ b/src/FShell_AppWidgetProviderInfoImpl.cpp @@ -16,8 +16,8 @@ // /** - * @file FShell_AppWidgetInfoImpl.cpp - * @brief This is the implementation for the _AppWidgetInfoImpl class. + * @file FShell_AppWidgetProviderInfoImpl.cpp + * @brief This is the implementation for the _AppWidgetProviderInfoImpl class. */ #include @@ -25,6 +25,9 @@ #include #include #include +#include +#include +#include #include #include #include "FShell_AppWidgetManagerImpl.h" @@ -33,7 +36,7 @@ namespace Tizen { namespace Shell { - +using namespace Tizen::App; using namespace Tizen::Base; using namespace Tizen::Base::Collection; using namespace Tizen::Graphics; @@ -115,14 +118,58 @@ _AppWidgetProviderInfoImpl::IsDefault() const return __isDefault; } +int +_AppWidgetProviderInfoImpl::GetPrivilegeLevel(const AppId& appId) +{ + + Package::_PackageManagerImpl* pPkg = Package::_PackageManagerImpl::GetInstance(); + SysTryReturn(NID_APP, pPkg != null, -1, E_INVALID_STATE, "Invalid PackageManager instance."); + + Package::PackageInfo* pInfo = null; + pInfo = pPkg->GetPackageInfoN(_AppInfo::GetPackageId()); + SysTryReturn(NID_APP, pInfo != null, GetLastResult(), GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult())); + + const Package::_PackageInfoImpl* pPkgInfo = Package::_PackageInfoImpl::GetInstance(pInfo); + SysTryReturnResult(NID_APP, pPkgInfo != null, E_INVALID_STATE, "Invalid PackageInfo instance."); + + return pPkgInfo->GetApiVisibility(); +} + +bool +_AppWidgetProviderInfoImpl::IsValidSize(const AppId& appId, int w, int h) +{ + if (appId.StartsWith("com.samsung.", 0) == true) + { + return true; + } + +// static const int UNIT_SIZE_BASE = 175; + static const int UNIT_SIZE_2 = 354;// UNIT_SIZE_BASE*n + 4*(n-1) +// static const int UNIT_SIZE_4 = 712; + + int privilegeLevel = GetPrivilegeLevel(appId); + if( privilegeLevel == _API_VISIBILITY_PUBLIC || privilegeLevel == _API_VISIBILITY_PARTNER) + { + if( h > UNIT_SIZE_2 || w > UNIT_SIZE_2) + { + return false; + } + } + /*else if( size.height > UNIT_SIZE_4 || size.width > UNIT_SIZE_4) + { + return false; + }*/ + return true; +} + Tizen::Base::Collection::IList* _AppWidgetProviderInfoImpl::GetSizeInfoListN() const { - const int SUPPORTED_SIZE_TYPE_MAX = 6; + static const int MAX_SUPPORTED_SIZE_TYPE = 6;//TODO: check this value. - int supportedSizeCount = SUPPORTED_SIZE_TYPE_MAX; - int widthArray[SUPPORTED_SIZE_TYPE_MAX]; - int heightArray[SUPPORTED_SIZE_TYPE_MAX]; + int supportedSizeCount = MAX_SUPPORTED_SIZE_TYPE; + int widthArray[MAX_SUPPORTED_SIZE_TYPE]; + int heightArray[MAX_SUPPORTED_SIZE_TYPE]; std::unique_ptr pPackageId(_StringConverter::CopyToCharArrayN(__providerId)); livebox_service_get_supported_sizes(pPackageId.get(), &supportedSizeCount , widthArray, heightArray); @@ -140,6 +187,12 @@ _AppWidgetProviderInfoImpl::GetSizeInfoListN() const { size.SetSize(widthArray[i], heightArray[i]); previewImagePath = livebox_service_preview(pPackageId.get(), livebox_service_size_type(static_cast(size.width), static_cast(size.height) ) ); + + if( IsValidSize(__appId, size.width, size.height) == false ) + { + continue; + } + std::unique_ptr pAppWidgetSizeInfo(_AppWidgetSizeInfoImpl::CreateAppWidgetSizeInfo(size, previewImagePath) ); SysTryReturn(NID_SHELL, pAppWidgetSizeInfo, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Failed to allocate memory for AppWidgetSizeInfo." ); pSizes->Add( *pAppWidgetSizeInfo.release() ); diff --git a/src/FShell_AppWidgetProviderManagerImpl.cpp b/src/FShell_AppWidgetProviderManagerImpl.cpp index a6526ce..f411674 100644 --- a/src/FShell_AppWidgetProviderManagerImpl.cpp +++ b/src/FShell_AppWidgetProviderManagerImpl.cpp @@ -56,6 +56,7 @@ namespace Tizen { namespace Shell { +using namespace std; using namespace Tizen::Base; using namespace Tizen::Base::Collection; using namespace Tizen::App; @@ -109,7 +110,7 @@ _AppWidgetProviderManagerImpl::GetInstance() static _AppWidgetProviderManagerImpl* __pAppWidgetManagerImpl = null; if( __pAppWidgetManagerImpl == null) { - __pAppWidgetManagerImpl = new (std::nothrow)_AppWidgetProviderManagerImpl; + __pAppWidgetManagerImpl = new (nothrow)_AppWidgetProviderManagerImpl; SysTryReturn(NID_SHELL, __pAppWidgetManagerImpl, null, E_OUT_OF_MEMORY, "Allocating new _AppWidgetManagerProxy failed."); result r = __pAppWidgetManagerImpl->Construct(); @@ -127,6 +128,7 @@ _AppWidgetProviderManagerImpl::Construct() __touchEventListeners.Construct(); Tizen::App::_AppImpl::GetInstance()->SetAppControlProviderInternalEventListener(this); + _ServiceAppImpl::GetInstance()->SetLifeDurationEventListener(this); SysLog(NID_SHELL, "Exit."); return E_SUCCESS; @@ -283,8 +285,8 @@ _AppWidgetProviderManagerImpl::CheckCertificate(const Tizen::App::AppId& localAp package_manager_compare_result_type_e res; - std::unique_ptr pLocalAppId(_StringConverter::CopyToCharArrayN(localAppId)); - std::unique_ptr pRemoteAppId(_StringConverter::CopyToCharArrayN(remoteAppId)); + unique_ptr pLocalAppId(_StringConverter::CopyToCharArrayN(localAppId)); + unique_ptr pRemoteAppId(_StringConverter::CopyToCharArrayN(remoteAppId)); int ret = package_manager_compare_app_cert_info(pLocalAppId.get(), pRemoteAppId.get(), &res); SysTryReturnResult(NID_SHELL, ret == 0, E_SYSTEM, "Failed to check the certificate: %d", ret); @@ -324,14 +326,14 @@ _AppWidgetProviderManagerImpl::AddAppWidget(const Tizen::App::AppId& providerApp String iconPath = pPackageInfo->GetAppMenuIconPath(); delete pPackageInfo; - std::unique_ptr pProviderId(_StringConverter::CopyToCharArrayN(providerId)); - std::unique_ptr pName(_StringConverter::CopyToCharArrayN(text)); - std::unique_ptr pContent(_StringConverter::CopyToCharArrayN(userInfo)); - std::unique_ptr pIcon(_StringConverter::CopyToCharArrayN(iconPath)); + unique_ptr pProviderId(_StringConverter::CopyToCharArrayN(providerId)); + unique_ptr pName(_StringConverter::CopyToCharArrayN(text)); + unique_ptr pContent(_StringConverter::CopyToCharArrayN(userInfo)); + unique_ptr pIcon(_StringConverter::CopyToCharArrayN(iconPath)); int ret = add_to_home_livebox(pProviderId.get(), pName.get(), LIVEBOX_TYPE_DEFAULT, pContent.get(), pIcon.get(), -1.0l, true, AddAppWidgetCallback, this); - SysTryReturnResult(NID_SHELL, ret != SHORTCUT_ERROR_COMM, E_CONNECTION_FAILED, "[E_CONNECTION_FAILED] failed to add_to_home_livebox"); - SysTryReturnResult(NID_SHELL, ret == SHORTCUT_SUCCESS, E_SYSTEM, "[E_SYSTEM] failed to add_to_home_livebox (%s)", strerror(r)); + SysTryReturnResult(NID_SHELL, ret != SHORTCUT_ERROR_COMM, E_CONNECTION_FAILED, "Failed to add_to_home_livebox"); + SysTryReturnResult(NID_SHELL, ret == SHORTCUT_SUCCESS, E_SYSTEM, "[E_SYSTEM] Failed to add_to_home_livebox (%s)", strerror(r)); return E_SUCCESS; } @@ -632,6 +634,8 @@ _AppWidgetProviderManagerImpl::RemoveAppWidget(const String& instanceId, bool te if( pAppWidgetProvider != null) { + pAppWidgetProvider->OnAppWidgetProviderRemoved(); + pAppWidgetProvider->OnAppWidgetProviderTerminating(); delete pAppWidgetProvider; } @@ -668,7 +672,7 @@ _AppWidgetProviderManagerImpl::DestroyAppWidgetPopupProvider(const String& insta { SysLog(NID_SHELL, "instanceId(%ls)", instanceId.GetPointer()); - if( __pAppWidgetPopupProvider != null) + if( __pAppWidgetPopupProvider ) { __pAppWidgetPopupProvider->OnAppWidgetPopupProviderTerminating(); delete __pAppWidgetPopupProvider; @@ -760,4 +764,27 @@ _AppWidgetProviderManagerImpl::RequestSyncSharedMemoryForPD(const Tizen::Base::S return pProxy->RequestSyncSharedMemoryForPD(instanceId); } +void +_AppWidgetProviderManagerImpl::OnApplicationTerminated(const AppId& appId, int pid) +{ + /////////////////////////////////////////////// + // This listener is called when life duration is expired + /////////////////////////////////////////////// + + AppWidgetProvider* pAppWidgetProvider; + unique_ptr > pMapEnum(__appwidgetProviders.GetMapEnumeratorN() ); + while (pMapEnum->MoveNext() == E_SUCCESS) + { + pAppWidgetProvider = null; + + pMapEnum->GetValue(pAppWidgetProvider); + if( pAppWidgetProvider ) + { + pAppWidgetProvider->OnAppWidgetProviderTerminating(); + delete pAppWidgetProvider; + } + } + __appwidgetProviders.RemoveAll(); +} + }} // Tizen::Shell diff --git a/src/inc/FShell_AppWidgetProviderInfoImpl.h b/src/inc/FShell_AppWidgetProviderInfoImpl.h index 8842f07..c0a10fe 100644 --- a/src/inc/FShell_AppWidgetProviderInfoImpl.h +++ b/src/inc/FShell_AppWidgetProviderInfoImpl.h @@ -17,9 +17,9 @@ /** * @file FShell_AppWidgetProviderInfoImpl.h - * @brief This is the header file for the _AppWidgetInfoImpl class. + * @brief This is the header file for the _AppWidgetProviderInfoImpl class. * - * This header file contains the declarations of the _AppWidgetInfoImpl class. + * This header file contains the declarations of the _AppWidgetProviderInfoImpl class. */ #ifndef _FSHELL_INTERNAL_APPWIDGET_PROVIDER_INFO_IMPL_H_ @@ -112,6 +112,8 @@ public: static AppWidgetProviderInfo* GetAppWidgetProviderInfoN(const Tizen::App::AppId& appId, const Tizen::Base::String& providerName, bool isDefault); static _AppWidgetProviderInfoImpl* GetImpl(const AppWidgetProviderInfo& appwidgetProviderInfo); + static int GetPrivilegeLevel(const Tizen::App::AppId& appId); + static bool IsValidSize(const Tizen::App::AppId& appId, int w, int h); private: /** diff --git a/src/inc/FShell_AppWidgetProviderManagerImpl.h b/src/inc/FShell_AppWidgetProviderManagerImpl.h index fafc148..feb8c75 100644 --- a/src/inc/FShell_AppWidgetProviderManagerImpl.h +++ b/src/inc/FShell_AppWidgetProviderManagerImpl.h @@ -31,6 +31,7 @@ #include #include #include +#include namespace Tizen { namespace Shell { @@ -48,6 +49,7 @@ class _AppWidgetManagerProxy; class _OSP_EXPORT_ _AppWidgetProviderManagerImpl : public Tizen::App::IAppControlProviderEventListener + , public Tizen::App::_IAppEventListener , public Tizen::Base::Object { public: @@ -104,6 +106,9 @@ private: static result CheckCertificate(const Tizen::App::AppId& localAppId, const Tizen::App::AppId& remoteAppId); static bool IsSamePackage(const Tizen::App::AppId& appId1, const Tizen::App::AppId& appId2); + virtual void OnApplicationLaunched(const Tizen::App::AppId& appId, int pid) {} + virtual void OnApplicationTerminated(const Tizen::App::AppId& appId, int pid); + private: // for AppWidget IAppWidgetProviderFactory* __pAppWidgetFactory;