implement LifeDuration feature, add size check for public signatured app
authorjungmin76.park <jungmin76.park@samsung.com>
Thu, 18 Apr 2013 04:34:28 +0000 (13:34 +0900)
committerGerrit Code Review <gerrit2@kim11>
Thu, 18 Apr 2013 08:57:36 +0000 (17:57 +0900)
Change-Id: Ic8711efb9053ab22734d4c4218a4bb0351ef17e4
Signed-off-by: jungmin76.park <jungmin76.park@samsung.com>
src/FShell_AppWidgetProviderInfoImpl.cpp
src/FShell_AppWidgetProviderManagerImpl.cpp
src/inc/FShell_AppWidgetProviderInfoImpl.h
src/inc/FShell_AppWidgetProviderManagerImpl.h

index 70cf0a4..fd9ef39 100644 (file)
@@ -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 <unique_ptr.h>
@@ -25,6 +25,9 @@
 #include <FBase.h>
 #include <FBaseSysLog.h>
 #include <FBase_StringConverter.h>
+#include <FApp_AppInfo.h>
+#include <FAppPkg_PackageManagerImpl.h>
+#include <FAppPkg_PackageInfoImpl.h>
 #include <FShellAppWidgetProviderInfo.h>
 #include <FShellAppWidgetSizeInfo.h>
 #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<char[]> 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<int>(size.width), static_cast<int>(size.height) ) );
+
+               if( IsValidSize(__appId, size.width, size.height) == false )
+               {
+                       continue;
+               }
+
                std::unique_ptr<AppWidgetSizeInfo> 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() );
index a6526ce..f411674 100644 (file)
@@ -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<char[]> pLocalAppId(_StringConverter::CopyToCharArrayN(localAppId));
-       std::unique_ptr<char[]> pRemoteAppId(_StringConverter::CopyToCharArrayN(remoteAppId));
+       unique_ptr<char[]> pLocalAppId(_StringConverter::CopyToCharArrayN(localAppId));
+       unique_ptr<char[]> 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<char[]> pProviderId(_StringConverter::CopyToCharArrayN(providerId));
-       std::unique_ptr<char[]> pName(_StringConverter::CopyToCharArrayN(text));
-       std::unique_ptr<char[]> pContent(_StringConverter::CopyToCharArrayN(userInfo));
-       std::unique_ptr<char[]> pIcon(_StringConverter::CopyToCharArrayN(iconPath));
+       unique_ptr<char[]> pProviderId(_StringConverter::CopyToCharArrayN(providerId));
+       unique_ptr<char[]> pName(_StringConverter::CopyToCharArrayN(text));
+       unique_ptr<char[]> pContent(_StringConverter::CopyToCharArrayN(userInfo));
+       unique_ptr<char[]> 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<IMapEnumeratorT< Tizen::Base::String, Tizen::Shell::AppWidgetProvider*> > pMapEnum(__appwidgetProviders.GetMapEnumeratorN() );
+       while (pMapEnum->MoveNext() == E_SUCCESS)
+       {
+               pAppWidgetProvider = null;
+
+               pMapEnum->GetValue(pAppWidgetProvider);
+               if( pAppWidgetProvider )
+               {
+                       pAppWidgetProvider->OnAppWidgetProviderTerminating();
+                       delete pAppWidgetProvider;
+               }
+       }
+       __appwidgetProviders.RemoveAll();
+}
+
 }} // Tizen::Shell
index 8842f07..c0a10fe 100644 (file)
@@ -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:
        /**
index fafc148..feb8c75 100644 (file)
@@ -31,6 +31,7 @@
 #include <FBaseColIMap.h>
 #include <FAppTypes.h>
 #include <FAppIAppControlProviderEventListener.h>
+#include <FApp_IAppEventListener.h>
 
 
 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;