fix proxy not to set instance when it's failed to construct, check exception for...
[framework/osp/shell.git] / src / FShell_AppWidgetProviderInfoImpl.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_AppWidgetProviderInfoImpl.cpp
19  * @brief       This is the implementation for the _AppWidgetProviderInfoImpl class.
20  */
21
22 #include <unique_ptr.h>
23 #include <livebox-service/livebox-service.h>
24 #include <FBase.h>
25 #include <FBaseSysLog.h>
26 #include <FBase_StringConverter.h>
27 #include <FApp_AppInfo.h>
28 #include <FApp_Aul.h>
29 #include <FAppPkg_PackageManagerImpl.h>
30 #include <FAppPkg_PackageInfoImpl.h>
31 #include <FShellAppWidgetProviderInfo.h>
32 #include <FShellAppWidgetSizeInfo.h>
33 #include "FShell_AppWidgetManagerImpl.h"
34 #include "FShell_AppWidgetProviderInfoImpl.h"
35 #include "FShell_AppWidgetSizeInfoImpl.h"
36
37 namespace Tizen { namespace Shell {
38
39 using namespace Tizen::App;
40 using namespace Tizen::Base;
41 using namespace Tizen::Base::Collection;
42 using namespace Tizen::Graphics;
43
44
45 _AppWidgetProviderInfoImpl::_AppWidgetProviderInfoImpl(const Tizen::App::AppId& appId, const Tizen::Base::String& name)
46         :__appId(appId)
47         ,__name(name)
48         ,__isDefault(false)
49 {
50         __providerId = _AppWidgetManagerImpl::MakeProviderName(appId, name);
51
52         std::unique_ptr<char[]> pProviderId(_StringConverter::CopyToCharArrayN(__providerId));
53         std::unique_ptr<char[]> pDisplayName(livebox_service_i18n_name(pProviderId.get(), null));
54         std::unique_ptr<char[]> pSetUpAppId(livebox_service_setup_appid(pProviderId.get()));
55         __displayName = pDisplayName.get();
56         __configurationAppControlAppId = pSetUpAppId.get();
57
58         SysSecureLog(NID_SHELL, "appId(%ls), name(%ls), providerId(%ls), displayName(%ls), configuration(%ls)", appId.GetPointer(), name.GetPointer(), __providerId.GetPointer(), __displayName.GetPointer(), __configurationAppControlAppId.GetPointer() );
59 }
60
61 /*_AppWidgetProviderInfoImpl::_AppWidgetProviderInfoImpl(const _AppWidgetProviderInfoImpl& rhs)
62 {
63         __appId = rhs.__appId;
64         __name = rhs.__name;
65         __providerId = rhs.__providerId;
66 }
67
68 _AppWidgetProviderInfoImpl&
69 _AppWidgetProviderInfoImpl::operator =(const _AppWidgetProviderInfoImpl& rhs)
70 {
71         __appId = rhs.__appId;
72         __name = rhs.__name;
73         __providerId = rhs.__providerId;
74
75         return *this;
76 }*/
77
78 _AppWidgetProviderInfoImpl::~_AppWidgetProviderInfoImpl()
79 {
80 }
81
82 Tizen::App::AppId
83 _AppWidgetProviderInfoImpl::GetAppId() const
84 {
85         return __appId;
86 }
87
88 Tizen::Base::String
89 _AppWidgetProviderInfoImpl::GetName() const
90 {
91         return __name;
92 }
93
94 Tizen::Base::String
95 _AppWidgetProviderInfoImpl::GetDisplayName() const
96 {
97 /*      std::unique_ptr<char[]> pPackageId(_StringConverter::CopyToCharArrayN(__providerId));
98         __displayName = livebox_service_i18n_name(pPackageId.get(), null);*/
99         return __displayName;
100 }
101
102 Tizen::Base::String
103 _AppWidgetProviderInfoImpl::GetIconPath() const
104 {
105         std::unique_ptr<char[]> pPackageId(_StringConverter::CopyToCharArrayN(__providerId));
106         String iconPath = livebox_service_i18n_icon(pPackageId.get(), null);
107
108         return iconPath;
109 }
110
111 Tizen::Base::String
112 _AppWidgetProviderInfoImpl::GetConfigurationAppControlAppId() const
113 {
114         return __configurationAppControlAppId;
115 }
116
117 bool
118 _AppWidgetProviderInfoImpl::IsDefault() const
119 {
120         return __isDefault;
121 }
122
123 int
124 _AppWidgetProviderInfoImpl::GetPrivilegeLevel(const AppId& appId)
125 {
126
127         Package::_PackageManagerImpl* pPkg = Package::_PackageManagerImpl::GetInstance();
128         SysTryReturn(NID_APP, pPkg != null, _API_VISIBILITY_PUBLIC, E_INVALID_STATE, "Invalid PackageManager instance.");
129
130         String pkgId = Package::_PackageManagerImpl::GetPackageIdByAppId(appId);
131         SysTryReturn(NID_APP, !pkgId.IsEmpty(), _API_VISIBILITY_PUBLIC, E_INVALID_STATE, "Invalid appId(%ls).", appId.GetPointer() );
132
133         Package::PackageInfo* pInfo = pPkg->GetPackageInfoN(pkgId);
134         SysTryReturn(NID_APP, pInfo != null, _API_VISIBILITY_PUBLIC, GetLastResult(), "[%s] Propagating.", GetErrorMessage(GetLastResult()));
135
136         const Package::_PackageInfoImpl* pPkgInfo = Package::_PackageInfoImpl::GetInstance(pInfo);
137         SysTryReturn(NID_APP, pPkgInfo != null, _API_VISIBILITY_PUBLIC, E_INVALID_STATE, "Invalid PackageInfo instance.");
138
139         return pPkgInfo->GetApiVisibility();
140 }
141
142 bool
143 _AppWidgetProviderInfoImpl::IsValidSize(const AppId& appId, int w, int h)
144 {
145         if (appId.StartsWith("com.samsung.", 0) == true)
146         {
147                 return true;
148         }
149
150 //      static const int UNIT_SIZE_BASE = 175;
151         static const int UNIT_SIZE_2 = 354;// UNIT_SIZE_BASE*n + 4*(n-1)
152 //      static const int UNIT_SIZE_4 = 712;
153
154         int privilegeLevel = GetPrivilegeLevel(appId);
155         if( privilegeLevel == _API_VISIBILITY_PUBLIC || privilegeLevel == _API_VISIBILITY_PARTNER)
156         {
157                  if( h > UNIT_SIZE_2 || w > UNIT_SIZE_2)
158                  {
159                          SysLog(NID_SHELL, "%dx%d size is invalid for %d privilege", privilegeLevel);
160                          return false;
161                  }
162         }
163         /*else if( size.height > UNIT_SIZE_4 || size.width > UNIT_SIZE_4)
164         {
165                 return false;
166         }*/
167         return true;
168 }
169
170 Tizen::Base::Collection::IList*
171 _AppWidgetProviderInfoImpl::GetSizeInfoListN() const
172 {
173         static const int MAX_SUPPORTED_SIZE_TYPE = 6;//TODO: check this value.
174
175         int supportedSizeCount = MAX_SUPPORTED_SIZE_TYPE;
176         int widthArray[MAX_SUPPORTED_SIZE_TYPE];
177         int heightArray[MAX_SUPPORTED_SIZE_TYPE];
178
179         std::unique_ptr<char[]> pPackageId(_StringConverter::CopyToCharArrayN(__providerId));
180         livebox_service_get_supported_sizes(pPackageId.get(), &supportedSizeCount , widthArray, heightArray);
181
182         SysTryReturn(NID_SHELL, supportedSizeCount > 0, null, E_INVALID_ARG, "[E_INVALID_ARG] There is no appwidget of provider(%ls)",__providerId.GetPointer() );
183
184         std::unique_ptr<ArrayList> pSizes(new (std::nothrow) ArrayList);
185         SysTryReturn(NID_SHELL, pSizes, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Failed to allocate memory for ArrayList." );
186
187         pSizes->Construct();
188         FloatDimension size(0, 0);
189         String previewImagePath;
190
191         for(int i = 0; i < supportedSizeCount; i++)
192         {
193                 size.SetSize(widthArray[i], heightArray[i]);
194                 previewImagePath  = livebox_service_preview(pPackageId.get(), livebox_service_size_type(static_cast<int>(size.width), static_cast<int>(size.height) ) );
195
196                 if( IsValidSize(__appId, size.width, size.height) == false )
197                 {
198                         continue;
199                 }
200
201                 std::unique_ptr<AppWidgetSizeInfo> pAppWidgetSizeInfo(_AppWidgetSizeInfoImpl::CreateAppWidgetSizeInfo(size, previewImagePath) );
202                 SysTryReturn(NID_SHELL, pAppWidgetSizeInfo, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Failed to allocate memory for AppWidgetSizeInfo." );
203                 pSizes->Add( *pAppWidgetSizeInfo.release() );
204         }
205         return pSizes.release();
206 }
207
208 AppWidgetProviderInfo*
209 _AppWidgetProviderInfoImpl::GetAppWidgetProviderInfoN(const Tizen::App::AppId& appId, const Tizen::Base::String& providerName)
210 {
211         std::unique_ptr<char[]> pProviderId(_StringConverter::CopyToCharArrayN(_AppWidgetManagerImpl::MakeProviderName(appId, providerName)));
212
213         bool isDefault = livebox_service_is_primary(pProviderId.get());
214         return GetAppWidgetProviderInfoN(appId, providerName, isDefault);
215 }
216
217 AppWidgetProviderInfo*
218 _AppWidgetProviderInfoImpl::GetAppWidgetProviderInfoN(const Tizen::App::AppId& appId, const Tizen::Base::String& providerName, bool isDefault)
219 {
220         SysTryReturn(NID_SHELL, IsExist(appId, providerName) == true, null, E_APP_NOT_INSTALLED, "The application(%ls) is not installed.", appId.GetPointer());
221
222         AppWidgetProviderInfo* pInfo = new (std::nothrow) AppWidgetProviderInfo(appId, providerName);
223         SysTryReturn(NID_SHELL, pInfo, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Failed to allocate memory for AppWidgetProviderInfo." );
224
225         _AppWidgetProviderInfoImpl::GetImpl(*pInfo)->__isDefault = isDefault;
226
227         return pInfo;
228 }
229
230 bool
231 _AppWidgetProviderInfoImpl::IsExist(const Tizen::App::AppId& appId, const Tizen::Base::String& providerName)
232 {
233         SysTryReturn(NID_SHELL, Tizen::App::_Aul::IsInstalled(appId) == true, false, E_APP_NOT_INSTALLED, "The application(%ls) is not installed.", appId.GetPointer());
234
235         std::unique_ptr<char[]> pProviderId(_StringConverter::CopyToCharArrayN(_AppWidgetManagerImpl::MakeProviderName(appId, providerName)));
236         std::unique_ptr<char[]> pPackageId(livebox_service_appid(pProviderId.get()));
237         SysTryReturn(NID_SHELL, pPackageId.get(), false, E_APP_NOT_INSTALLED, "The application(%ls) is not installed.", appId.GetPointer());
238
239         return true;
240 }
241
242 _AppWidgetProviderInfoImpl*
243 _AppWidgetProviderInfoImpl::GetImpl(const AppWidgetProviderInfo& appwidgetProviderInfo)
244 {
245         return static_cast<_AppWidgetProviderInfoImpl*>(appwidgetProviderInfo.__pAppWidgetProviderInfoImpl);
246 }
247
248 } /* namespace AppWidget */
249 } /* namespace Samsung */