2 * Copyright (c) [2012] Samsung Electronics Co., Ltd.
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://floralicense.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.
22 #include "mp-video-log.h"
23 #include "video-player.h"
24 #include "mp-video-app-ctrl.h"
25 #include "mp-util-media-service.h"
26 #include "mp-video-string-define.h"
27 #include "mp-external-ug.h"
28 #include "mp-video-service-ctrl.h"
30 static void appResume(void *pUserData);
32 static bool bIsForeground = FALSE;
34 static Ecore_Idler *pInitIdlerHandle = NULL;
36 static Eina_Bool _mp_focus_in_cb(void *pUserData, int nType, void *pEvent)
39 VideoLogInfo("[ERR] No exist pUserData.");
40 return ECORE_CALLBACK_PASS_ON;
44 VideoLogInfo("[ERR] No exist pEvent.");
45 return ECORE_CALLBACK_PASS_ON;
48 VideoAppData *pAppData = (VideoAppData *)pUserData;
50 Ecore_X_Event_Window_Focus_In *ev = (Ecore_X_Event_Window_Focus_In *)pEvent;
52 if (ev->win == MpUtilGetMainWindowXID())
54 if(bIsForeground && MpVideoAppCtrlIsTopView(pUserData))
56 VideoLogInfo("resume for focus in");
57 pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlResume(pAppData);
61 return ECORE_CALLBACK_PASS_ON;
64 static Eina_Bool _mp_focus_out_cb(void *pUserData, int nType, void *pEvent)
67 VideoLogInfo("[ERR] No exist pUserData.");
68 return ECORE_CALLBACK_PASS_ON;
72 VideoLogInfo("[ERR] No exist pEvent.");
73 return ECORE_CALLBACK_PASS_ON;
76 VideoAppData *pAppData = (VideoAppData *)pUserData;
78 Ecore_X_Event_Window_Focus_Out *ev = (Ecore_X_Event_Window_Focus_Out *)pEvent;
80 if (ev->win == MpUtilGetMainWindowXID())
82 if(bIsForeground && MpVideoAppCtrlIsTopView(pUserData))
84 VideoLogInfo("pause for focus in");
85 pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlPause(pAppData);
89 return ECORE_CALLBACK_PASS_ON;
94 static Eina_Bool _mp_client_message_cb(void *pUserData, int nType, void *pEvent)
97 VideoLogInfo("[ERR] No exist pUserData.");
98 return ECORE_CALLBACK_PASS_ON;
102 VideoLogInfo("[ERR] No exist pEvent.");
103 return ECORE_CALLBACK_PASS_ON;
106 VideoAppData *pAppData = (VideoAppData *)pUserData;
108 Ecore_X_Event_Client_Message *ev = (Ecore_X_Event_Client_Message *) pEvent;
110 if (ev->message_type == ECORE_X_ATOM_E_ILLUME_QUICKPANEL_STATE)
112 if (ev->data.l[0] == ECORE_X_ATOM_E_ILLUME_QUICKPANEL_ON)
114 VideoLogInfo("quickpanel show");
115 if(MpVideoAppCtrlIsTopView(pUserData) && bIsForeground)
117 pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlPause(pAppData);
122 VideoLogInfo("quickpanel hide");
123 if(MpVideoAppCtrlIsTopView(pUserData) && bIsForeground)
125 pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlResume(pAppData);
130 return ECORE_CALLBACK_PASS_ON;
133 static Eina_Bool _mp_app_init_idler_cb(void *pUserData)
136 VideoLogInfo("[ERR] No exist pUserData.");
137 return ECORE_CALLBACK_CANCEL;
141 VideoAppData *pAppData = (VideoAppData *)pUserData;
143 ecore_event_handler_add(ECORE_X_EVENT_CLIENT_MESSAGE, _mp_client_message_cb, (void *)pAppData);
144 ecore_event_handler_add(ECORE_X_EVENT_WINDOW_FOCUS_IN, _mp_focus_in_cb, (void *)pAppData);
145 ecore_event_handler_add(ECORE_X_EVENT_WINDOW_FOCUS_OUT, _mp_focus_out_cb, (void *)pAppData);
147 pInitIdlerHandle = NULL;
149 return ECORE_CALLBACK_CANCEL;
153 static void _mp_alloc_service_value(void *pUserData)
158 VideoLogInfo("[ERR] No exist pUserData.");
163 VideoAppData *pAppData = (VideoAppData *)pUserData;
165 pAppData->szSubtitle = calloc(1, sizeof(char) * STR_LEN_MAX);
166 pAppData->szVideoTitle = calloc(1, sizeof(char) * STR_LEN_MAX);
168 pAppData->szMediaUri = calloc(1, sizeof(char) * STR_LEN_MAX);
169 pAppData->szPreMediaUri = calloc(1, sizeof(char) * STR_LEN_MAX);
170 pAppData->szNextMediaUri = calloc(1, sizeof(char) * STR_LEN_MAX);
172 pAppData->szProxyAddress = calloc(1, sizeof(char) * STR_LEN_MAX);
173 pAppData->szUserAgent = calloc(1, sizeof(char) * STR_LEN_MAX);
174 pAppData->szCookie = calloc(1, sizeof(char) * STR_LEN_MAX);
178 static void _mp_free_service_value(void *pUserData)
183 VideoLogInfo("[ERR] No exist pUserData.");
188 VideoAppData *pAppData = (VideoAppData *)pUserData;
190 if(pAppData->szSubtitle)
192 free(pAppData->szSubtitle);
193 pAppData->szSubtitle = NULL;
196 if(pAppData->szVideoTitle)
198 free(pAppData->szVideoTitle);
199 pAppData->szVideoTitle = NULL;
202 if(pAppData->szMediaUri)
204 free(pAppData->szMediaUri);
205 pAppData->szMediaUri = NULL;
207 if(pAppData->szPreMediaUri)
209 free(pAppData->szPreMediaUri);
210 pAppData->szPreMediaUri = NULL;
213 if(pAppData->szNextMediaUri)
215 free(pAppData->szNextMediaUri);
216 pAppData->szNextMediaUri = NULL;
219 if(pAppData->szProxyAddress)
221 free(pAppData->szProxyAddress);
222 pAppData->szProxyAddress = NULL;
225 if(pAppData->szUserAgent)
227 free(pAppData->szUserAgent);
228 pAppData->szUserAgent = NULL;
231 if(pAppData->szCookie)
233 free(pAppData->szCookie);
234 pAppData->szCookie = NULL;
238 static bool appCreate(void *pUserData)
243 VideoLogInfo("[ERR] No exist pUserData.");
247 VideoAppData *pAppData = (VideoAppData *)pUserData;
249 _mp_alloc_service_value((void *)pAppData);
251 pInitIdlerHandle = ecore_idler_add(_mp_app_init_idler_cb, (void *)pAppData);
254 elm_config_preferred_engine_set("opengl_x11");
256 elm_config_preferred_engine_set("software_x11");
259 elm_theme_extension_add(NULL, VIDEO_CUSTOM_THEME);
264 if(!MpUtilMMCstatusNoti(pAppData))
266 VideoLogError("[ERR] Fail to set MMC notification.");
269 bIsForeground = FALSE;
271 MpVideoAppCtrlSetForCheckingForegroundwindow(FALSE);
276 static void appService(service_h pAppSvcHandle, void *pUserData)
282 VideoLogInfo("[ERR] No exist pUserData.");
283 bIsForeground = FALSE;
284 MpVideoAppCtrlSetForCheckingForegroundwindow(FALSE);
288 VideoAppData *pAppData = (VideoAppData *)pUserData;
290 char* szGetMediaUri = NULL;
294 VideoLogInfo("[ERR] No exist pBundle.");
295 bIsForeground = FALSE;
296 MpVideoAppCtrlSetForCheckingForegroundwindow(FALSE);
300 if(pAppData->pMainWindow == NULL)
302 VideoLogInfo("Create main window.");
303 pAppData->pMainWindow = (Evas_Object *)MpUtilCreateMainWindow(PACKAGE);
307 if(strlen(pAppData->szMediaUri) > 0)
309 MpVideoAppCtrlResetForRelaunching(pAppData);
313 if(MpVideoServiceCtrlInitServiceParser((void*)pAppSvcHandle, &szGetMediaUri) == MP_ERROR_PLAYER_TYPE)
315 VideoLogInfo("[ERR] Fail to init service parser.");
316 bIsForeground = FALSE;
317 MpVideoAppCtrlSetForCheckingForegroundwindow(FALSE);
323 strncpy(pAppData->szMediaUri, szGetMediaUri, STR_LEN_MAX);
324 VideoLogInfo("szGetMediaUri : %s", pAppData->szMediaUri);
329 VideoLogInfo("No exist szGetMediaUri");
332 if(!MpUtilBatteryStatusNoti(pAppData))
334 VideoLogInfo("[ERR] Fail to set Battery notification.");
335 bIsForeground = FALSE;
336 MpVideoAppCtrlSetForCheckingForegroundwindow(FALSE);
339 bIsForeground = TRUE;
341 MpUtilMediaSvcInitSession();
342 MpUtilSetKeyGrab(HOME_KEY, KEY_GRAB_SHARED);
343 MpVideoAppCtrlInit(pAppData);
346 static void appExit(void *pUserData)
351 VideoLogInfo("[ERR] No exist pUserData.");
354 VideoAppData *pAppData = (VideoAppData *)pUserData;
356 pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlExit(pAppData);
358 MpUtilMultimediaVolumeKeyUngrab();
359 MpUtilLcdOffForPowerButton();
360 MpUtilSetKeyUngrab(HOME_KEY);
361 MpUtilMultimediaKeyUngrab();
362 MpUtilMMCstatusNotiIgnore();
363 MpUtilBatteryStatusNotiIgnore();
364 MpUtilFinishSession();
365 MpUtilDeletePopupHandle();
366 MpUtilMediaSvcDestoryVideoList();
367 MpUtilMediaSvcFinishSession();
369 _mp_free_service_value(pUserData);
371 bIsForeground = FALSE;
372 MpVideoAppCtrlSetForCheckingForegroundwindow(FALSE);
374 #ifdef TA_SVAE_PERF_FILE
379 static void appPause(void *pUserData)
383 VideoLogInfo("No exist pUserdata handle.");
389 MpUtilMultimediaVolumeKeyUngrab();
391 VideoAppData *pAppData = (VideoAppData *)pUserData;
393 if(MpVideoAppCtrlIsCheckCallStatus())
395 VideoLogInfo("Skip for Call Pause.");
396 MpVideoAppCtrlInitCheckCallStatus();
399 int nTmpPlayerType = MpVideoServiceCtrlGetPlayerType();
401 if(nTmpPlayerType == MP_VIDEO_PLAYER ||
402 nTmpPlayerType == MP_VIDEO_PLAYER_SIMPLE ||
403 nTmpPlayerType == MP_VIDEO_PLAYER_GALLERY ||
404 nTmpPlayerType == MP_VIDEO_PLAYER_EMAIL ||
405 nTmpPlayerType == MP_VIDEO_PLAYER_MMS)
407 VideoLogInfo("Pause application at video player.");
408 pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlExit(pAppData);
410 else if(nTmpPlayerType == MP_STREAMING_PLAYER)
412 VideoLogInfo("Pause application at streaming player.");
413 pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlExit(pAppData);
416 pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlHideLayout(pAppData);
418 MpUtilDeletePopupHandle();
420 elm_win_indicator_mode_set(pAppData->pMainWindow, ELM_WIN_INDICATOR_SHOW);
422 bIsForeground = FALSE;
423 MpVideoAppCtrlSetForCheckingForegroundwindow(FALSE);
425 evas_object_hide(pAppData->pMainWindow);
428 static void appResume(void *pUserData)
432 VideoLogInfo("No exist pUserdata handle.");
438 VideoAppData *pAppData = (VideoAppData *)pUserData;
442 VideoLogInfo("Defence overlap launching.");
446 MpUtilMultimediaVolumeKeyGrab();
448 if(!MpVideoAppCtrlIsTopView(pUserData))
450 VideoLogError("Overlay is not staied in top.");
454 if(MpVideoAppCtrlIsExistPlayerHandle())
456 pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlResume(pAppData);
460 pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlStartByAppResume(pAppData);
463 elm_win_indicator_mode_set(pAppData->pMainWindow, ELM_WIN_INDICATOR_SHOW);
465 bIsForeground = TRUE;
466 MpVideoAppCtrlSetForCheckingForegroundwindow(TRUE);
468 evas_object_show(pAppData->pMainWindow);
471 static void appRotate(app_device_orientation_e rotateState, void *pUserData)
479 case APP_DEVICE_ORIENTATION_0:
480 VideoLogInfo("VIDEO_ROTATE_PORTRAIT_NORMAL");
481 nCurRotate = VIDEO_ROTATE_PORTRAIT_NORMAL;
484 case APP_DEVICE_ORIENTATION_90:
485 VideoLogInfo("VIDEO_ROTATE_LANDSCAPE_REVERSE");
486 nCurRotate = VIDEO_ROTATE_LANDSCAPE_REVERSE;
489 case APP_DEVICE_ORIENTATION_180:
490 VideoLogInfo("VIDEO_ROTATE_PORTRAIT_REVERSE");
491 nCurRotate = VIDEO_ROTATE_PORTRAIT_REVERSE;
494 case APP_DEVICE_ORIENTATION_270:
495 VideoLogInfo("VIDEO_ROTATE_LANDSCAPE_NORMAL");
496 nCurRotate = VIDEO_ROTATE_LANDSCAPE_NORMAL;
500 MpVideoAppCtrlSetRotation(nCurRotate, pUserData);
503 int main(int argc, char *argv[])
505 VideoAppData pAppData;
506 memset(&pAppData, 0, sizeof(VideoAppData));
508 app_event_callback_s st_appEventService;
510 st_appEventService.create = appCreate;
511 st_appEventService.terminate = appExit;
512 st_appEventService.pause = appPause;
513 st_appEventService.resume = appResume;
514 st_appEventService.service = appService;
515 st_appEventService.low_memory = NULL;
516 st_appEventService.low_battery = NULL;
517 st_appEventService.device_orientation = appRotate;
518 st_appEventService.language_changed = NULL;
519 st_appEventService.region_format_changed = NULL;
521 if(app_efl_main(&argc, &argv, &st_appEventService, &pAppData) != APP_ERROR_NONE)
523 VideoLogInfo("[ERR] app_efl_main().");
527 VideoLogInfo("escape app_efl_main() loop.");