2 * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
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 <AppCommon.h>
23 #include "FbBaseView.h"
27 #include "SourceCtxPopup.h"
28 #include "SortCtxPopup.h"
29 #include "FbAllLayout.h"
30 #include "FbPhotoLayout.h"
31 #include "FbVideoLayout.h"
32 #include "FbMusicLayout.h"
34 #define TOTAL_GROUP_BTNS 4
35 #define TOTAL_TOP_BTNS 2
36 #define TOTAL_UPDATE_CALLBACKS 2
37 #define PARAM_URI "uri"
38 #define PARAM_SOURCE "source"
44 const char *icon_path;
59 const char *source_arg[] = {
65 const char *linked_app[] = {
67 N_("org.tizen.gallery-tv-ref"),
68 N_("org.tizen.video-player-tv-ref"),
69 N_("org.tizen.music-player-tv-ref"),
73 const char* _get_layout_id(int curLayoutId){
79 return FB_PHOTO_LAYOUT;
81 return FB_VIDEO_LAYOUT;
83 return FB_MUSIC_LAYOUT;
85 return FB_ALL_LAYOUT; // default
91 Evas_Object *eoBtnGroup[TOTAL_GROUP_BTNS];
92 Evas_Object *eoSelectedBtnGroup;//Evas_Object *c_grpbtn;
93 Evas_Object *eoBtnSource;
94 Evas_Object *eoBtnSort;
96 CContextPopup *pCtxPopup;
99 CLayoutMgr *pLayoutMgr;
102 CFbAllLayout *pFbAllLayout;
103 CFbPhotoLayout *pFbPhotoLayout;
104 CFbVideoLayout *pFbVideoLayout;
105 CFbMusicLayout *pFbMusicLayout;
110 memset(eoBtnGroup, 0, sizeof(eoBtnGroup));
111 pHandlerBase = new CHandlerBase(this);
112 for (a = 0; a < TOTAL_TOP_BTNS; a++)
113 pHandlerButton[a] = new CHandlerButton(this);
114 for (a = 0; a < TOTAL_GROUP_BTNS; a++){
115 pHandlerGroup[a] = new CHandlerGroup(this);
118 virtual ~SFbBaseView() {
122 for (a = 0; a < TOTAL_TOP_BTNS; a++)
123 delete pHandlerButton[a];
124 for (a = 0; a < TOTAL_GROUP_BTNS; a++)
125 delete pHandlerGroup[a];
128 class CHandlerBase : public CListenerMgr, public IKeyDownListener, public IKeyUpListener{
132 CHandlerBase(SFbBaseView *ins) : IKeyDownListener(this), IKeyUpListener(this) { m = ins; }
134 virtual void OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev) {
135 _DBG("m->curLayoutId = %d",m->curLayoutId);
136 if (!strcmp(ev->keyname, KEY_EXIT))
139 virtual void OnKeyUp(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Up *ev)
141 _DBG("m->curLayoutId = %d",m->curLayoutId);
142 if (!strcmp(ev->keyname, KEY_ENTER) || !strcmp(ev->keyname, KEY_ENTER_REMOTE)) {
143 if (elm_object_focus_get(m->eoSelectedBtnGroup)) {
144 switch(m->curLayoutId)
147 m->pFbAllLayout->SetFocus(EINA_TRUE);
150 m->pFbPhotoLayout->SetFocus(EINA_TRUE);
153 m->pFbVideoLayout->SetFocus(EINA_TRUE);
156 m->pFbMusicLayout->SetFocus(EINA_TRUE);
165 class CHandlerButton : public CListenerMgr, protected IKeyDownListener, IMouseMoveListener, IMouseClickedListener {
169 static void sm_CbCtxPopupSelected(void* cookie, CContextPopup* instance, const char* text)
171 SFbBaseView* m = (SFbBaseView*)cookie;
175 _DBG(" instance->Type(): %d", instance->Type());
176 switch (instance->Type()) {
177 case CContextPopup::TOPBTN_SORT:
178 elm_object_text_set(m->eoBtnSort, text);
179 switch(m->curLayoutId)
182 m->pFbAllLayout->SetUpdateFlag(true);
185 m->pFbPhotoLayout->SetUpdateFlag(true);
188 m->pFbVideoLayout->SetUpdateFlag(true);
191 m->pFbMusicLayout->SetUpdateFlag(true);
194 m->pLayoutMgr->Show(_get_layout_id(m->curLayoutId));
197 case CContextPopup::TOPBTN_SOURCE:
198 elm_object_text_set(m->eoBtnSource, text);
199 switch(m->curLayoutId)
202 m->pFbAllLayout->SetUpdateFlag(true);
205 m->pFbPhotoLayout->SetUpdateFlag(true);
208 m->pFbVideoLayout->SetUpdateFlag(true);
211 m->pFbMusicLayout->SetUpdateFlag(true);
214 m->pLayoutMgr->Show(_get_layout_id(m->curLayoutId));
223 CHandlerButton(SFbBaseView *ins) : IKeyDownListener(this), IMouseMoveListener(this), IMouseClickedListener(this) { m = ins; }
225 virtual void OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev) {
227 if (!strcmp(ev->keyname, KEY_BACK) || !strcmp(ev->keyname, KEY_BACK_REMOTE))
228 elm_object_focus_set(m->eoSelectedBtnGroup, EINA_TRUE);
230 virtual void OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev) {
232 if (!elm_object_focus_get(obj))
233 elm_object_focus_set(obj, EINA_TRUE);
235 virtual void OnMouseClicked(int id, Evas_Object *obj) {
237 CSourceCtxPopup::SCallback cb;
239 cb.onSelected = sm_CbCtxPopupSelected;
241 if (obj == m->eoBtnSource) {
242 CSourceCtxPopup* pCtxPopup = new CSourceCtxPopup;
243 m->pCtxPopup = pCtxPopup;
244 pCtxPopup->Create(m->eoBase, &cb);
246 else if (obj == m->eoBtnSort) {
247 CSortCtxPopup* pCtxPopup = new CSortCtxPopup;
248 m->pCtxPopup = pCtxPopup;
249 pCtxPopup->Create(m->eoBase, &cb);
252 } *pHandlerButton[TOTAL_TOP_BTNS];
254 class CHandlerGroup : public CListenerMgr, IMouseMoveListener, IKeyDownListener, IMouseClickedListener {
258 CHandlerGroup(SFbBaseView *ins) :
259 IMouseMoveListener(this),
260 IKeyDownListener(this),
261 IMouseClickedListener(this) { m = ins; }
263 virtual void OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev) {
265 if (!elm_object_focus_get(obj))
266 elm_object_focus_set(obj, EINA_TRUE);
268 virtual void OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev) {
270 if (!strcmp(ev->keyname, KEY_BACK) || !strcmp(ev->keyname, KEY_BACK_REMOTE))
273 virtual void OnMouseClicked(int id, Evas_Object *obj) {
274 if (m->eoSelectedBtnGroup == obj)
277 elm_object_signal_emit(m->eoSelectedBtnGroup, FBR_SIGNAL_GROUP_UNSELECTED, "");
278 m->eoSelectedBtnGroup = obj;
279 elm_object_signal_emit(m->eoSelectedBtnGroup, FBR_SIGNAL_GROUP_SELECTED, "");
284 m->curLayoutId = ALL_LAYOUT;
287 m->curLayoutId = PHOTO_LAYOUT;
290 m->curLayoutId = VIDEO_LAYOUT;
293 m->curLayoutId = MUSIC_LAYOUT;
296 _ERR("Fix it: it can not make it , MouseClicked");
297 m->curLayoutId = ALL_LAYOUT; // default
300 _DBG("id = %d, m->curLayoutId = %d", id, m->curLayoutId);
301 m->pLayoutMgr->Show(_get_layout_id(m->curLayoutId));
303 } *pHandlerGroup[TOTAL_GROUP_BTNS];
307 Evas_Object *_add_button(Evas_Object *box)
314 button = elm_button_add(box);
318 evas_object_size_hint_weight_set(button,
319 EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
320 evas_object_show(button);
325 void CFbBaseView::UpdateEmptyFocusSequence(void)
329 if (t_SelectedGroupButton() == m->eoBtnGroup[E_GRP_ALL]) {
330 elm_object_part_text_set(m->eoBase, FBR_PART_NO_CONTENT, _(NO_FILE_MESSAGE));
331 elm_object_part_text_set(m->eoBase, FBR_PART_NO_CONTENT_SUB, _(NO_FILE_MESSAGE_SUB));
333 else if (t_SelectedGroupButton() == m->eoBtnGroup[E_GRP_PHOTO]) {
334 elm_object_part_text_set(m->eoBase, FBR_PART_NO_CONTENT, _(NO_PHOTO_MESSAGE));
335 elm_object_part_text_set(m->eoBase, FBR_PART_NO_CONTENT_SUB, _(NO_PHOTO_MESSAGE_SUB));
337 else if (t_SelectedGroupButton() == m->eoBtnGroup[E_GRP_VIDEO]) {
338 elm_object_part_text_set(m->eoBase, FBR_PART_NO_CONTENT, _(NO_VIDEO_MESSAGE));
339 elm_object_part_text_set(m->eoBase, FBR_PART_NO_CONTENT_SUB, _(NO_VIDEO_MESSAGE_SUB));
341 else if (t_SelectedGroupButton() == m->eoBtnGroup[E_GRP_MUSIC]) {
342 elm_object_part_text_set(m->eoBase, FBR_PART_NO_CONTENT, _(NO_MUSIC_MESSAGE));
343 elm_object_part_text_set(m->eoBase, FBR_PART_NO_CONTENT_SUB, _(NO_MUSIC_MESSAGE_SUB));
347 void CFbBaseView::UnsetFocus(void)
349 elm_object_focus_set(t_SelectedGroupButton(), EINA_TRUE);
352 void CFbBaseView::CbLinkApp(int type, int source_type, char *path)
357 args = bundle_create();
359 _ERR("unable to create bundle");
363 bundle_add(args, PARAM_SOURCE, source_arg[source_type]);
364 bundle_add(args, PARAM_URI, path);
366 r = aul_launch_app(linked_app[type], args);
370 _ERR(" Unable to launch linked app");
377 void CFbBaseView::UpdatedGrid(void)
379 elm_object_part_text_set(m->eoBase, FBR_PART_NO_CONTENT, "");
380 elm_object_part_text_set(m->eoBase, FBR_PART_NO_CONTENT_SUB, "");
383 void CFbBaseView::t_CreateTopSession(void)
388 struct _btn_info btninfo[TOTAL_TOP_BTNS];
389 btninfo[TOPBTN_SOURCE].style = FBR_STYLE_SOURCE_BTN;
390 btninfo[TOPBTN_SOURCE].part = FBR_PART_SOURCE_HOVERSEL;
392 btninfo[TOPBTN_SORT].style = FBR_STYLE_SORT_BTN;
393 btninfo[TOPBTN_SORT].part = FBR_PART_SORT_HOVERSEL;
395 elm_object_part_text_set(m->eoBase, FBR_PART_TITLE,
398 for (i = 0; i < TOTAL_TOP_BTNS; i++) {
399 btn = _add_button(m->eoBase);
401 _ERR(" Adding btn failed ");
405 elm_object_style_set(btn, btninfo[i].style);
406 elm_object_part_content_set(m->eoBase, btninfo[i].part, btn);
408 m->pHandlerButton[i]->Connect(btn);
410 if (i == TOPBTN_SOURCE)
411 m->eoBtnSource = btn;
412 else if (i == TOPBTN_SORT)
416 elm_object_text_set(m->eoBtnSource, _(CSourceCtxPopup::SourceText(CInfo::SourceType())));
417 elm_object_text_set(m->eoBtnSort, _(CSortCtxPopup::SortText(CInfo::SortType())));
420 void CFbBaseView::t_CreateLeftSession(void)
423 Evas_Object *box, *ic;
425 char buf[MAX_LENGTH];
426 static struct _btn_info btninfo[TOTAL_GROUP_BTNS];
427 btninfo[E_GRP_ALL].txt = N_("ALL");
428 btninfo[E_GRP_ALL].icon_path = FBR_IMAGE_GRPBTN_ALL;
429 btninfo[E_GRP_PHOTO].txt = N_("PHOTO");
430 btninfo[E_GRP_PHOTO].icon_path = FBR_IMAGE_GRPBTN_PHOTO;
431 btninfo[E_GRP_VIDEO].txt = N_("VIDEO");
432 btninfo[E_GRP_VIDEO].icon_path = FBR_IMAGE_GRPBTN_VIDEO;
433 btninfo[E_GRP_MUSIC].txt = N_("MUSIC");
434 btninfo[E_GRP_MUSIC].icon_path = FBR_IMAGE_GRPBTN_MUSIC;
436 box = elm_box_add(m->eoBase);
439 evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
440 evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL);
441 evas_object_show(box);
443 for (i = 0; i < TOTAL_GROUP_BTNS; i++) {
444 m->eoBtnGroup[i] = _add_button(box);
445 if (!m->eoBtnGroup[i]) {
446 _ERR(" failed to add button to box ");
450 elm_box_pack_end(box, m->eoBtnGroup[i]);
451 elm_object_style_set(m->eoBtnGroup[i], FBR_STYLE_GROUPBTN);
452 elm_object_text_set(m->eoBtnGroup[i], _(btninfo[i].txt));
454 m->pHandlerGroup[i]->Connect(m->eoBtnGroup[i], i);
456 ic = elm_image_add(m->eoBtnGroup[i]);
460 snprintf(buf, sizeof(buf), "%s/%s", IMAGEDIR,
461 btninfo[i].icon_path);
462 elm_image_file_set(ic, buf, NULL);
463 elm_object_part_content_set(m->eoBtnGroup[i],
464 FBR_PART_ELM_SWALLOWICON, ic);
467 t_SetSelectedGroupButton(m->eoBtnGroup[E_GRP_ALL]);
469 elm_object_signal_emit(m->eoBtnGroup[E_GRP_ALL], FBR_SIGNAL_GROUP_SELECTED, "");
470 elm_object_focus_set(m->eoBtnGroup[E_GRP_ALL], EINA_TRUE);
471 elm_object_part_content_set(m->eoBase, FBR_PART_GROUPBTN_BOX, box);
473 elm_object_focus_next_object_set(m->eoBtnGroup[E_GRP_ALL], m->eoBtnGroup[E_GRP_MUSIC], ELM_FOCUS_UP);
474 elm_object_focus_next_object_set(m->eoBtnGroup[E_GRP_MUSIC], m->eoBtnGroup[E_GRP_ALL], ELM_FOCUS_DOWN);
477 void CFbBaseView::t_CreateFullView(void)
480 t_CreateTopSession();
481 t_CreateLeftSession();
482 m->pLayoutMgr->Show(_get_layout_id(m->curLayoutId));
485 void CFbBaseView::t_SetSelectedGroupButton(Evas_Object* obj)
488 for (int a = 0; a < TOTAL_GROUP_BTNS; a++) {
489 if (m->eoBtnGroup[a] == obj)
491 m->eoSelectedBtnGroup = obj;
492 CInfo::SetGroupIndex(a);
498 Evas_Object* CFbBaseView::t_SelectedGroupButton(void)
500 return m->eoSelectedBtnGroup;
503 void CFbBaseView::t_OnShow(void)
507 evas_object_show(m->eoBase);
509 CBaseView::t_OnShow();
512 void CFbBaseView::t_OnUpdate(void *data)
514 switch(m->curLayoutId)
517 m->pFbAllLayout->Action();
520 m->pFbPhotoLayout->Action();
523 m->pFbVideoLayout->Action();
526 m->pFbMusicLayout->Action();
531 void CFbBaseView::t_OnHide(void)
533 evas_object_hide(m->eoBase);
535 CBaseView::t_OnHide();
538 bool CFbBaseView::Create(void *data)
542 Evas_Object *eoWin = CViewMgr::GetInstance()->Window();
543 Evas_Object *eoBase = NULL;
545 int source_type = E_ALL;
548 _CHECK(m = new SFbBaseView)
549 _CHECK(eoBase = elm_layout_add(eoWin))
550 _CHECK(elm_layout_file_set(eoBase, EDJEFILE, FBR_BASE_VIEW))
552 evas_object_size_hint_weight_set(eoBase, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
553 elm_win_resize_object_add(eoWin, eoBase);
555 /* get the source_type using 'data' string */
559 int arrsize = ARRAY_SIZE(source_arg);
560 for (i = 0; i < arrsize; i++) {
561 if (source_arg[i] && !strcmp(source_arg[i], (const char*)data)) {
566 if (source_type < E_ALL || source_type > E_USB)
568 CInfo::SetSourceType(source_type);
573 _CHECK(m->pLayoutMgr = new CLayoutMgr)
574 _CHECK(m->pLayoutMgr->Create(eoBase, NULL))
575 _CHECK(m->pFbAllLayout = new CFbAllLayout(FB_ALL_LAYOUT))
576 _CHECK(m->pFbPhotoLayout = new CFbPhotoLayout(FB_PHOTO_LAYOUT))
577 _CHECK(m->pFbVideoLayout = new CFbVideoLayout(FB_VIDEO_LAYOUT))
578 _CHECK(m->pFbMusicLayout = new CFbMusicLayout(FB_MUSIC_LAYOUT))
579 _CHECK(m->pFbAllLayout->Create(m->pLayoutMgr, NULL))
580 _CHECK(m->pFbPhotoLayout->Create(m->pLayoutMgr, NULL))
581 _CHECK(m->pFbVideoLayout->Create(m->pLayoutMgr, NULL))
582 _CHECK(m->pFbMusicLayout->Create(m->pLayoutMgr, NULL))
583 _CHECK(m->pLayoutMgr->AddLayout(m->pFbAllLayout))
584 _CHECK(m->pLayoutMgr->AddLayout(m->pFbPhotoLayout))
585 _CHECK(m->pLayoutMgr->AddLayout(m->pFbVideoLayout))
586 _CHECK(m->pLayoutMgr->AddLayout(m->pFbMusicLayout))
588 if(!CUsbListener::Create())
589 _ERR("Fail to create CUsbListener()");
590 if(!CMediaContentListener::Create())
591 _ERR("Fail to create CMediaContentListener()");
595 _CHECK_FAIL{ m->pLayoutMgr->RemoveLayout(m->pFbMusicLayout); }
596 _CHECK_FAIL{ m->pLayoutMgr->RemoveLayout(m->pFbVideoLayout); }
597 _CHECK_FAIL{ m->pLayoutMgr->RemoveLayout(m->pFbPhotoLayout); }
598 _CHECK_FAIL{ m->pLayoutMgr->RemoveLayout(m->pFbAllLayout); }
599 _CHECK_FAIL{ m->pFbMusicLayout->Destroy(); }
600 _CHECK_FAIL{ m->pFbVideoLayout->Destroy(); }
601 _CHECK_FAIL{ m->pFbPhotoLayout->Destroy(); }
602 _CHECK_FAIL{ m->pFbAllLayout->Destroy(); }
603 _CHECK_FAIL{ delete m->pFbMusicLayout; m->pFbMusicLayout = NULL; }
604 _CHECK_FAIL{ delete m->pFbVideoLayout; m->pFbVideoLayout = NULL; }
605 _CHECK_FAIL{ delete m->pFbPhotoLayout; m->pFbPhotoLayout = NULL; }
606 _CHECK_FAIL{ delete m->pFbAllLayout; m->pFbAllLayout = NULL; }
607 _CHECK_FAIL{ m->pLayoutMgr->Destroy(); }
608 _CHECK_FAIL{ delete m->pLayoutMgr; m->pLayoutMgr = NULL; }
609 _CHECK_FAIL{ /* elm_layout_file_set*/ }
610 _CHECK_FAIL{ evas_object_del(eoBase); }
611 _CHECK_FAIL{ delete m; m = NULL; }
612 } _CREATE_END_AND_CATCH{ return false; }
615 // original create grid
616 CInfo::SetSortType(0/*CSort::SORT_NAME_AZ*/);
617 evas_object_data_set(eoBase, BASE_VIEW_DATA, this);
618 m->curLayoutId = ALL_LAYOUT;
619 _DBG("curLayoutId = %s", _get_layout_id(m->curLayoutId));
621 elm_object_focus_allow_set(eoBase, EINA_FALSE);
622 m->pHandlerBase->Connect(eoBase);
623 CBaseView::Create(NULL);
627 void CFbBaseView::Destroy(void)
631 CBaseView::Destroy();
633 if(CMediaContentListener::FlagCreate())
634 CMediaContentListener::Destroy();
635 if(CUsbListener::FlagCreate())
636 CUsbListener::Destroy();
638 m->pLayoutMgr->RemoveLayout(m->pFbMusicLayout);
639 m->pFbMusicLayout->Destroy();
640 delete m->pFbMusicLayout;
642 m->pLayoutMgr->RemoveLayout(m->pFbVideoLayout);
643 m->pFbVideoLayout->Destroy();
644 delete m->pFbVideoLayout;
646 m->pLayoutMgr->RemoveLayout(m->pFbPhotoLayout);
647 m->pFbPhotoLayout->Destroy();
648 delete m->pFbPhotoLayout;
650 m->pLayoutMgr->RemoveLayout(m->pFbAllLayout);
651 m->pFbAllLayout->Destroy();
652 delete m->pFbAllLayout;
654 m->pLayoutMgr->Destroy();
655 delete m->pLayoutMgr;
657 evas_object_del(m->eoBase);
664 Evas_Object* CFbBaseView::Base(void)
672 void CFbBaseView::OnStatusChanged(SUsbHostDeviceInfo *changedDevice, SUsbHostDeviceStatus status)
674 if(status == USB_HOST_DEV_CONNECTED) {
675 m->pPopup = new CPopup;
678 if (!m->pPopup->Create(m->eoBase)) {
684 if (CInfo::SourceType() == E_USB) {
685 if (!FlagConnected()) {
686 CInfo::SetSourceType(E_ALL);
687 elm_object_text_set(m->eoBtnSource,
688 _(CSourceCtxPopup::SourceText(CInfo::SourceType())));
692 /* FIXME: should add disconnected flow */
696 void CFbBaseView::OnDbUpdated(const SEntity *entity)
699 m->pPopup->Destroy();
704 m->pCtxPopup->Destroy();
708 if (CInfo::SourceType() != E_TV) {
709 m->pLayoutMgr->Show(_get_layout_id(m->curLayoutId));
710 elm_object_focus_set(t_SelectedGroupButton(), EINA_TRUE);