fix proxy not to set instance when it's failed to construct, check exception for...
[framework/osp/shell.git] / src / FShell_AppWidgetManagerImpl.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
24 #include <shortcut.h>
25 #include <livebox-service/livebox-service.h>
26
27 #include <FBaseSysLog.h>
28 #include <FBase.h>
29 #include <FApp.h>
30 #include <FGrpDimension.h>
31 #include <FApp_AppImpl.h>
32 #include <FBase_StringConverter.h>
33 #include <FAppPkg_PackageManagerImpl.h>
34
35 #include <FShellAppWidgetProviderInfo.h>
36 #include <FShellAppWidgetProvider.h>
37 #include <FShellAppWidgetPopupProvider.h>
38 #include <FShellAppWidgetFrame.h>
39 #include <FShellAppWidgetPopup.h>
40
41 #include <FShellIAppWidgetRequestListener.h>
42 #include <FShellIAppWidgetProviderFactory.h>
43 #include <FShellIAppWidgetPopupProviderFactory.h>
44
45 #include <FShell_IAppWidgetTouchEventListener.h>
46 #include <FShell_TemplateUtil.h>
47
48 #include "FShell_ShortcutManagerImpl.h"
49 #include "FShell_AppWidgetManagerProxy.h"
50 #include "FShell_AppWidgetManagerImpl.h"
51 #include "FShell_AppWidgetProviderInfoImpl.h"
52
53 namespace Tizen { namespace Shell
54 {
55
56 using namespace Tizen::Base;
57 using namespace Tizen::Base::Collection;
58 using namespace Tizen::App;
59 using namespace Tizen::Graphics;
60
61 _AppWidgetManagerImpl::_AppWidgetManagerImpl()
62         :__pAppWidgetRequestEventListener(null)
63 {
64         SysLog(NID_SHELL, "");
65 }
66
67 _AppWidgetManagerImpl::~_AppWidgetManagerImpl()
68 {
69         SysLog(NID_SHELL, "");
70         livebox_service_fini();
71 }
72
73 _AppWidgetManagerImpl*
74 _AppWidgetManagerImpl::GetInstance()
75 {
76         static _AppWidgetManagerImpl* __pAppWidgetManagerImpl = null;
77         if( __pAppWidgetManagerImpl == null)
78         {
79                 __pAppWidgetManagerImpl = new (std::nothrow)_AppWidgetManagerImpl;
80                 SysTryReturn(NID_SHELL, __pAppWidgetManagerImpl, null, E_OUT_OF_MEMORY, "Allocating new _AppWidgetManagerProxy failed.");
81
82                 result r = __pAppWidgetManagerImpl->Construct();
83                 SysTryReturn(NID_SHELL, !IsFailed(r), null, r, "[%s] Propagating.", GetErrorMessage(r));
84         }
85         return __pAppWidgetManagerImpl;
86 }
87
88 result
89 _AppWidgetManagerImpl::Construct()
90 {
91         SysLog(NID_SHELL, "Enter.");
92
93         int ret = livebox_service_init();
94         SysTryReturnResult(NID_SHELL, ret == 0, E_SYSTEM, "[E_SYSTEM] Failed to invoke livebox_service_init, ret (%d)", ret);
95
96         SysLog(NID_SHELL, "Exit.");
97         return E_SUCCESS;
98 }
99
100 // c style callback for livebox_service_get_pkglist
101 int GetAppWidgetProviderInfoCallback(const char *pPackageId, const char *pProviderId, int is_prime, void *data)
102 {
103         SysLog(NID_SHELL, "%s, %s, is_prime(%d)", pPackageId, pProviderId, is_prime);
104
105         IList* pAppWidgetProviderInfos = static_cast<IList*>(data);
106         SysTryReturn(NID_SHELL, pAppWidgetProviderInfos, 0, E_SYSTEM, "[E_SYSTEM] system error.");
107
108         String providerId(pProviderId);
109         String appId;
110         String providerName;
111         _AppWidgetManagerImpl::ExtractAppIdAndProviderName(providerId, appId, providerName);
112
113         AppWidgetProviderInfo* pInfo = _AppWidgetProviderInfoImpl::GetAppWidgetProviderInfoN(appId, providerName, is_prime);
114         pAppWidgetProviderInfos->Add(*pInfo);
115
116         return 0;
117 }
118
119 Tizen::Base::Collection::IList*
120 _AppWidgetManagerImpl::GetAppWidgetProviderInfoListN()
121 {
122         std::unique_ptr<ArrayList> pAppWidgetProviders(new (std::nothrow) ArrayList());
123         SysTryReturn(NID_SHELL, pAppWidgetProviders.get(), null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Insufficient memory");
124
125         pAppWidgetProviders->Construct();
126         int ret = livebox_service_get_pkglist(GetAppWidgetProviderInfoCallback, pAppWidgetProviders.get());
127         if (ret < 0)
128         {
129                 SysLog(NID_SHELL, "Failed to invoke livebox_service_get_pkglist, ret (%d)", ret);
130         }
131
132         if (pAppWidgetProviders->GetCount() <= 0)
133         {
134                 return null;
135         }
136
137         return pAppWidgetProviders.release();
138 }
139
140 AppWidgetProviderInfo*
141 _AppWidgetManagerImpl::GetAppWidgetProviderInfoN(const Tizen::App::AppId& appId, const Tizen::Base::String& providerName)
142 {
143         return _AppWidgetProviderInfoImpl::GetAppWidgetProviderInfoN(appId, providerName);
144 }
145
146 AppWidgetProviderInfo*
147 _AppWidgetManagerImpl::GetDefaultAppWidgetProviderInfoN(const Tizen::App::PackageId& packageId)
148 {
149         SysTryReturn(NID_SHELL, Tizen::App::Package::_PackageManagerImpl::GetInstance()->IsPackageInstalled(packageId) == true,
150                         null, E_APP_NOT_INSTALLED,
151                         "[E_APP_NOT_INSTALLED] The application package(%ls) is not installed.", packageId.GetPointer() );
152
153         std::unique_ptr<char[]> pPackageId(_StringConverter::CopyToCharArrayN(packageId) );
154         std::unique_ptr<char[]> pDefaultProviderId(livebox_service_pkgname(pPackageId.get()) );
155         SysTryReturn(NID_SHELL, pDefaultProviderId.get(), null, E_SUCCESS, "Specified package(%ls) has no default provider.", packageId.GetPointer() );
156
157         String providerId(pDefaultProviderId.get());
158         String appId;
159         String providerName;
160         _AppWidgetManagerImpl::ExtractAppIdAndProviderName(providerId, appId, providerName);
161
162         return _AppWidgetProviderInfoImpl::GetAppWidgetProviderInfoN(appId, providerName, true);
163 }
164
165 bool
166 _AppWidgetManagerImpl::IsAppWidgetProviderDefault(const Tizen::App::AppId& appId, const Tizen::Base::String& providerName)
167 {
168         std::unique_ptr<char[]> pProviderId(_StringConverter::CopyToCharArrayN(_AppWidgetManagerImpl::MakeProviderName(appId, providerName)));
169         return livebox_service_is_primary(pProviderId.get());
170 }
171
172 // c - style callback for shortcut_set_request_cb
173 int AppWidgetRequestHandlerCallback(const char* providerId, const char* text, int type, const char* content_info, const char* icon, int pid, double period, int allowDuplication, void *data)
174 {
175         SysLog(NID_SHELL, "Enter");
176         SysTryReturn(NID_SHELL, providerId, 0, E_SYSTEM, "[E_SYSTEM] providerId is null!");
177
178         _AppWidgetManagerImpl* pAppWidgetManager = static_cast<_AppWidgetManagerImpl*>(data);
179         SysTryReturn(NID_SHELL, pAppWidgetManager, 0, E_SYSTEM, "[E_SYSTEM] pAppWidgetManager is null!");
180
181         String appId;
182         String providerName;
183         _AppWidgetManagerImpl::ExtractAppIdAndProviderName(providerId, appId, providerName);
184
185         IAppWidgetRequestListener* pListener = _AppWidgetManagerImpl::GetInstance()->GetAddRequestListener();
186         SysTryReturn(NID_SHELL, pAppWidgetManager, 0, E_SYSTEM, "[E_SYSTEM] pListener is null!");
187         pListener->OnAppWidgetAddRequested(appId, providerName, text, content_info);
188         return 0;
189 }
190
191 result
192 _AppWidgetManagerImpl::SetAppWidgetRequestListener(IAppWidgetRequestListener* pListener)
193 {
194 //      int ret = shortcut_set_request_cb(AppWidgetRequestHandlerCallback, this );
195 //      SysTryReturnResult(NID_SHELL, ret == 0, E_SYSTEM, "failed to shortcut_set_request_cb (%d)", ret);
196         _ShortcutManagerImpl::GetInstance()->SetAppWidgetRequestHandlerCallback(AppWidgetRequestHandlerCallback);
197
198         __pAppWidgetRequestEventListener = pListener;
199         return E_SUCCESS;
200 }
201
202 IAppWidgetRequestListener*
203 _AppWidgetManagerImpl::GetAddRequestListener()
204 {
205         return __pAppWidgetRequestEventListener;
206 }
207
208 // helper
209 result
210 _AppWidgetManagerImpl::ExtractAppIdAndProviderName(const Tizen::Base::String& providerId, Tizen::App::AppId& appId, Tizen::Base::String& providerName)
211 {
212         int index = 0;
213
214         if( providerId.StartsWith("com.samsung.", 0) == true)// for core livebox (plugin)
215         {
216                 if( providerId.IndexOf(".", 13, index) == E_SUCCESS)//"com.samsung._"
217                 {
218                         providerId.SubString(0, index, appId);
219                         providerId.SubString(index+1, providerName);
220                 }
221                 else
222                 {
223                         appId = providerId;
224                 }
225         }
226         else
227         {
228                 providerId.IndexOf(".", 12, index);//"1234567890._"
229                 providerId.SubString(0, index, appId);
230                 providerId.SubString(index+1, providerName);
231         }
232
233         return E_SUCCESS;
234 }
235
236 String
237 _AppWidgetManagerImpl::MakeProviderName(const Tizen::App::AppId& appId, const Tizen::Base::String& providerName)
238 {
239         if( providerName.IsEmpty() )
240         {
241                 return appId;// some of core appwidget
242         }
243
244         if (appId.IsEmpty())
245         {
246                 return providerName;// web appwidget
247         }
248
249         String providerId;
250         providerId.Format(128, L"%ls.%ls", appId.GetPointer(), providerName.GetPointer() );// native appwidget
251
252         return providerId;
253 }
254
255 }} // Tizen::Shell