2 * Copyright (c) 2013 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Flora License, Version 1.0 (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://www.tizenopensource.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.
17 * @file AppBoxRenderView.cpp
18 * @author Yunchan Cho (yunchan.cho@samsung.com)
24 #include <livebox-service.h>
25 #include <i_runnable_widget_object.h>
26 #include <core_module.h>
27 #include <dpl/fast_delegate.h>
28 #include <Core/View/IRenderView.h>
29 #include <Core/View/IPdHelper.h>
30 #include <Core/View/PdHelper.h>
31 #include <API/web_provider_livebox_info.h>
32 #include <Core/Util/Log.h>
33 #include "AppBoxObserver.h"
34 #include "AppBoxRenderBuffer.h"
35 #include "AppBoxRenderView.h"
37 #define RENDER_MAX_TIME 10.0
39 AppBoxRenderView::AppBoxRenderView(
40 std::string boxId, std::string instanceId,
41 Evas_Object* boxWin, EwkContextPtr ewkContext)
44 , m_instanceId(instanceId)
53 , m_ewkContext(ewkContext)
56 m_appId = getAppId(m_boxId);
57 if (m_appId.empty()) {
58 throw; //exception throw!
61 evas_object_show(m_boxWin);
62 m_renderBuffer = AppBoxObserver::Instance()->getRenderBuffer(m_instanceId);
63 AppBoxObserver::Instance()->registerRenderView(m_instanceId, this);
66 AppBoxRenderView::~AppBoxRenderView()
69 evas_object_hide(m_boxWin);
70 AppBoxObserver::Instance()->unregisterRenderView(m_instanceId);
73 void AppBoxRenderView::showBox(RenderInfoPtr renderInfo)
77 // delete already running timer
81 if (livebox_service_mouse_event(m_boxId.c_str())) {
82 m_renderBuffer->deleteTouchTimer();
86 m_startUrl = getStartUrl(URL_TYPE_BOX, renderInfo->defaultUrlParams);
89 LogD("can't create view instance");
93 // in case of showing box by request of pd open
95 m_pdHelper->setBaseWebView(m_baseWebView);
98 // resize webview fitted to width, height of Box
105 m_renderBuffer->startCanvasUpdate();
107 m_renderInfo = renderInfo;
110 bool AppBoxRenderView::createView()
117 m_baseWebView = NULL;
119 #ifdef MULTIPROCESS_SERVICE_SUPPORT
120 m_view = WRT::CoreModuleSingleton::
121 Instance().getRunnableWidgetObject(m_appId, DPL::Optional<unsigned>());
123 m_view = WRT::CoreModuleSingleton::
124 Instance().getRunnableWidgetObject(m_appId);
127 if (m_startUrl.empty()) {
128 LogD("no start url");
131 m_view->PrepareView(m_startUrl, m_boxWin, m_ewkContext.get());
132 m_view->CheckBeforeLaunch();
134 // set callback functions of RunnableWidgetObject
135 WRT::UserDelegatesPtr cbs(new WRT::UserDelegates);
136 cbs->loadStart = DPL::MakeDelegate(this, &AppBoxRenderView::startLoadCallback);
137 cbs->loadFinish = DPL::MakeDelegate(this, &AppBoxRenderView::finishLoadCallback);
138 cbs->bufferSet = DPL::MakeDelegate(this, &AppBoxRenderView::setBufferCallback);
139 cbs->bufferUnset = DPL::MakeDelegate(this, &AppBoxRenderView::unsetBufferCallback);
140 cbs->windowCreateBefore = DPL::MakeDelegate(this, &AppBoxRenderView::createWindowBeforeCallback);
141 cbs->windowCreateAfter = DPL::MakeDelegate(this, &AppBoxRenderView::createWindowAfterCallback);
142 m_view->SetUserDelegates(cbs);
145 m_baseWebView = m_view->GetCurrentWebview();
147 // To support transparent background
148 evas_object_color_set(m_baseWebView, 0, 0, 0, 0);
149 evas_object_layer_set(m_baseWebView, EVAS_LAYER_MAX);
153 bool AppBoxRenderView::destroyView()
157 m_renderBuffer->stopCanvasUpdate();
162 m_baseWebView = NULL;
168 void AppBoxRenderView::hideBox()
174 void AppBoxRenderView::pauseBox()
179 void AppBoxRenderView::resumeBox()
184 void AppBoxRenderView::showPd(Evas_Object* pdWin, RenderInfoPtr renderInfo)
189 std::string pdStartUrl = getStartUrl(URL_TYPE_PD, renderInfo->defaultUrlParams);
190 m_pdHelper = PdHelper::create(pdWin, pdStartUrl, renderInfo);
193 evas_object_show(pdWin);
194 showBox(m_renderInfo);
197 void AppBoxRenderView::hidePd()
204 // stop box webview after render timer
208 std::string AppBoxRenderView::getAppId(std::string& boxId)
212 const char* appId = web_provider_livebox_get_app_id(boxId.c_str());
214 LogD("no appid of %s", boxId.c_str());
215 return std::string();
218 return std::string(appId);
221 std::string AppBoxRenderView::getStartUrl(UrlType type, std::string& defaultParams)
226 url = livebox_service_lb_script_path(m_boxId.c_str());
229 url = livebox_service_pd_script_path(m_boxId.c_str());
232 LogD("no available type");
235 // add default parameters to start url
236 url += defaultParams;
241 Evas_Object* AppBoxRenderView::getCurrentSnapShot()
245 m_snapshot = m_renderBuffer->getSnapshot();
246 //evas_object_layer_set(m_snapshot, EVAS_LAYER_MAX);
251 void AppBoxRenderView::clearSnapShot()
255 evas_object_layer_set(m_snapshot, EVAS_LAYER_MIN);
256 //evas_object_hide(m_snapshot);
257 evas_object_del(m_snapshot);
262 void AppBoxRenderView::addRenderTimer()
265 if (m_fireRenderTimer) {
269 m_fireRenderTimer = ecore_timer_add(
271 fireRenderTimerCallback,
275 void AppBoxRenderView::deleteRenderTimer()
278 if (m_fireRenderTimer) {
279 ecore_timer_del(m_fireRenderTimer);
280 m_fireRenderTimer = NULL;
284 Eina_Bool AppBoxRenderView::fireRenderTimerCallback(void* data)
288 AppBoxRenderView* This = static_cast<AppBoxRenderView*>(data);
289 This->m_fireRenderTimer = NULL;
291 This->m_renderBuffer->stopCanvasUpdate();
292 if (livebox_service_mouse_event(This->m_boxId.c_str())) {
294 This->m_renderBuffer->deleteTouchTimer();
295 This->m_view->Suspend();
297 // Before webview should be removed,
298 // new evas object with last render data should be created
299 // otherwise, after webview is removed, box is white screen.
300 evas_object_show(This->getCurrentSnapShot());
304 return ECORE_CALLBACK_CANCEL;
307 Eina_Bool AppBoxRenderView::openPdIdlerCallback(void* data)
310 AppBoxRenderView* This = static_cast<AppBoxRenderView*>(data);
311 if (This && This->m_pdHelper) {
312 This->m_pdHelper->startOpen();
314 return ECORE_CALLBACK_CANCEL;
318 void AppBoxRenderView::startLoadCallback(Evas_Object* webview)
323 void AppBoxRenderView::finishLoadCallback(Evas_Object* webview)
326 ewk_view_visibility_set(webview, EINA_TRUE);
329 // start render timer
332 if (!(m_pdHelper->isPdOpened()) &&
333 webview == m_pdHelper->getBaseWebView())
336 ecore_idler_add(openPdIdlerCallback, this);
341 void AppBoxRenderView::createWindowBeforeCallback(Evas** canvas, Evas_Object* parent)
346 if (!(m_pdHelper->isPdOpened()) &&
347 parent == m_pdHelper->getBaseWebView())
349 LogD("pd canvas is used");
350 *canvas = m_pdHelper->getPdCanvas();
355 LogD("canvas of this webview is used");
356 *canvas = evas_object_evas_get(parent);
359 void AppBoxRenderView::createWindowAfterCallback(Evas_Object* parent, Evas_Object* child)
363 // To support transparent background
364 evas_object_color_set(child, 0, 0, 0, 0);
367 Evas* parentCanvas = evas_object_evas_get(parent);
368 Evas* childCanvas = evas_object_evas_get(child);
370 if (parentCanvas != childCanvas) {
371 // wrt-core change visibility value to false internally
372 // So plugin should reset this value to true for painting parent webview
373 ewk_view_visibility_set(parent, EINA_TRUE);
374 evas_object_show(parent);
375 m_pdHelper->finishOpen(child);
379 ewk_view_visibility_set(child, EINA_TRUE);
380 evas_object_show(child);
383 void AppBoxRenderView::setBufferCallback(Evas_Object* webview)
386 evas_object_show(webview);
387 evas_object_focus_set(webview, EINA_TRUE);
390 void AppBoxRenderView::unsetBufferCallback(Evas_Object* webview)
393 evas_object_hide(webview);