2 * Copyright (c) [2012] Samsung Electronics Co., Ltd.
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
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);
263 MpUtilVolumeTypeSet();
265 if(!MpUtilMMCstatusNoti(pAppData))
267 VideoLogError("[ERR] Fail to set MMC notification.");
270 bIsForeground = FALSE;
272 MpVideoAppCtrlSetForCheckingForegroundwindow(FALSE);
277 static void appService(service_h pAppSvcHandle, void *pUserData)
283 VideoLogInfo("[ERR] No exist pUserData.");
284 bIsForeground = FALSE;
285 MpVideoAppCtrlSetForCheckingForegroundwindow(FALSE);
289 VideoAppData *pAppData = (VideoAppData *)pUserData;
291 char* szGetMediaUri = NULL;
292 MpUtilVolumeTypeSet();
296 VideoLogInfo("[ERR] No exist pBundle.");
297 bIsForeground = FALSE;
298 MpVideoAppCtrlSetForCheckingForegroundwindow(FALSE);
302 if(pAppData->pMainWindow == NULL)
304 VideoLogInfo("Create main window.");
305 pAppData->pMainWindow = (Evas_Object *)MpUtilCreateMainWindow(PACKAGE);
309 if(strlen(pAppData->szMediaUri) > 0)
311 MpVideoAppCtrlResetForRelaunching(pAppData);
315 if(MpVideoServiceCtrlInitServiceParser((void*)pAppSvcHandle, &szGetMediaUri) == MP_ERROR_PLAYER_TYPE)
317 VideoLogInfo("[ERR] Fail to init service parser.");
318 bIsForeground = FALSE;
319 MpVideoAppCtrlSetForCheckingForegroundwindow(FALSE);
325 strncpy(pAppData->szMediaUri, szGetMediaUri, STR_LEN_MAX);
326 VideoLogInfo("szGetMediaUri : %s", pAppData->szMediaUri);
331 VideoLogInfo("No exist szGetMediaUri");
334 if(!MpUtilBatteryStatusNoti(pAppData))
336 VideoLogInfo("[ERR] Fail to set Battery notification.");
337 bIsForeground = FALSE;
338 MpVideoAppCtrlSetForCheckingForegroundwindow(FALSE);
341 bIsForeground = TRUE;
343 MpUtilMediaSvcInitSession();
344 MpUtilSetKeyGrab(HOME_KEY, KEY_GRAB_SHARED);
345 MpVideoAppCtrlInit(pAppData);
348 static void appExit(void *pUserData)
353 VideoLogInfo("[ERR] No exist pUserData.");
356 VideoAppData *pAppData = (VideoAppData *)pUserData;
358 pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlExit(pAppData);
360 MpUtilMultimediaVolumeKeyUngrab();
361 MpUtilLcdOffForPowerButton();
362 MpUtilSetKeyUngrab(HOME_KEY);
363 MpUtilMultimediaKeyUngrab();
364 MpUtilMMCstatusNotiIgnore();
365 MpUtilBatteryStatusNotiIgnore();
366 MpUtilVolumeTypeUnset();
367 MpUtilFinishSession();
368 MpUtilDeletePopupHandle();
369 MpUtilMediaSvcDestoryVideoList();
370 MpUtilMediaSvcFinishSession();
372 _mp_free_service_value(pUserData);
374 bIsForeground = FALSE;
375 MpVideoAppCtrlSetForCheckingForegroundwindow(FALSE);
377 #ifdef TA_SVAE_PERF_FILE
382 static void appPause(void *pUserData)
386 VideoLogInfo("No exist pUserdata handle.");
392 MpUtilVolumeTypeUnset();
393 MpUtilMultimediaVolumeKeyUngrab();
395 VideoAppData *pAppData = (VideoAppData *)pUserData;
397 if(MpVideoAppCtrlIsCheckCallStatus())
399 VideoLogInfo("Skip for Call Pause.");
400 MpVideoAppCtrlInitCheckCallStatus();
403 int nTmpPlayerType = MpVideoServiceCtrlGetPlayerType();
405 if(nTmpPlayerType == MP_VIDEO_PLAYER ||
406 nTmpPlayerType == MP_VIDEO_PLAYER_SIMPLE ||
407 nTmpPlayerType == MP_VIDEO_PLAYER_GALLERY ||
408 nTmpPlayerType == MP_VIDEO_PLAYER_EMAIL ||
409 nTmpPlayerType == MP_VIDEO_PLAYER_MMS)
411 VideoLogInfo("Pause application at video player.");
412 pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlExit(pAppData);
414 else if(nTmpPlayerType == MP_STREAMING_PLAYER)
416 VideoLogInfo("Pause application at streaming player.");
417 pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlExit(pAppData);
420 pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlHideLayout(pAppData);
422 MpUtilDeletePopupHandle();
424 elm_win_indicator_mode_set(pAppData->pMainWindow, ELM_WIN_INDICATOR_SHOW);
426 bIsForeground = FALSE;
427 MpVideoAppCtrlSetForCheckingForegroundwindow(FALSE);
429 evas_object_hide(pAppData->pMainWindow);
432 static void appResume(void *pUserData)
436 VideoLogInfo("No exist pUserdata handle.");
442 VideoAppData *pAppData = (VideoAppData *)pUserData;
446 VideoLogInfo("Defence overlap launching.");
449 MpUtilVolumeTypeSet();
451 MpUtilMultimediaVolumeKeyGrab();
453 if(!MpVideoAppCtrlIsTopView(pUserData))
455 VideoLogError("Overlay is not staied in top.");
459 if(MpVideoAppCtrlIsExistPlayerHandle())
461 pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlResume(pAppData);
465 pAppData->VideoAppCtrlCallbackFunc.VideoAppCtrlStartByAppResume(pAppData);
468 elm_win_indicator_mode_set(pAppData->pMainWindow, ELM_WIN_INDICATOR_SHOW);
470 bIsForeground = TRUE;
471 MpVideoAppCtrlSetForCheckingForegroundwindow(TRUE);
473 evas_object_show(pAppData->pMainWindow);
476 static void appRotate(app_device_orientation_e rotateState, void *pUserData)
484 case APP_DEVICE_ORIENTATION_0:
485 VideoLogInfo("VIDEO_ROTATE_PORTRAIT_NORMAL");
486 nCurRotate = VIDEO_ROTATE_PORTRAIT_NORMAL;
489 case APP_DEVICE_ORIENTATION_90:
490 VideoLogInfo("VIDEO_ROTATE_LANDSCAPE_REVERSE");
491 nCurRotate = VIDEO_ROTATE_LANDSCAPE_REVERSE;
494 case APP_DEVICE_ORIENTATION_180:
495 VideoLogInfo("VIDEO_ROTATE_PORTRAIT_REVERSE");
496 nCurRotate = VIDEO_ROTATE_PORTRAIT_REVERSE;
499 case APP_DEVICE_ORIENTATION_270:
500 VideoLogInfo("VIDEO_ROTATE_LANDSCAPE_NORMAL");
501 nCurRotate = VIDEO_ROTATE_LANDSCAPE_NORMAL;
505 MpVideoAppCtrlSetRotation(nCurRotate, pUserData);
508 int main(int argc, char *argv[])
510 VideoAppData pAppData;
511 memset(&pAppData, 0, sizeof(VideoAppData));
513 app_event_callback_s st_appEventService;
515 st_appEventService.create = appCreate;
516 st_appEventService.terminate = appExit;
517 st_appEventService.pause = appPause;
518 st_appEventService.resume = appResume;
519 st_appEventService.service = appService;
520 st_appEventService.low_memory = NULL;
521 st_appEventService.low_battery = NULL;
522 st_appEventService.device_orientation = appRotate;
523 st_appEventService.language_changed = NULL;
524 st_appEventService.region_format_changed = NULL;
526 if(app_efl_main(&argc, &argv, &st_appEventService, &pAppData) != APP_ERROR_NONE)
528 VideoLogInfo("[ERR] app_efl_main().");
532 VideoLogInfo("escape app_efl_main() loop.");