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.
17 #include <Elementary.h>
24 #include "AppCommon.h"
25 #include "ExtNameInfo.h"
28 #include <MediaContentDbListener.h>
29 #include <UsbConnectionListener.h>
31 #include "InputHandler.h"
36 #include "FbBaseView.h"
39 #include "SourceCtxPopup.h"
40 #include "SortCtxPopup.h"
43 #include <LayoutMgr.h>
44 #include <BaseLayout.h>
45 #include "FbAllLayout.h"
46 #include "FbPhotoLayout.h"
47 #include "FbVideoLayout.h"
48 #include "FbMusicLayout.h"
50 #define TOTAL_GROUP_BTNS 4
51 #define TOTAL_TOP_BTNS 2
52 #define TOTAL_UPDATE_CALLBACKS 2
53 #define PARAM_URI "uri"
54 #define PARAM_SOURCE "source"
60 const char *icon_path;
68 const char *source_arg[] = {
74 const char *linked_app[] = {
76 N_("org.tizen.gallery-tv-ref"),
77 N_("org.tizen.video-player-tv-ref"),
78 N_("org.tizen.music-player-tv-ref"),
85 Evas_Object *eoBtnGroup[TOTAL_GROUP_BTNS];
86 Evas_Object *eoSelectedBtnGroup;//Evas_Object *c_grpbtn;
87 Evas_Object *eoBtnSource;
88 Evas_Object *eoBtnSort;
93 CLayoutMgr *pLayoutMgr;
95 char* *pCurrentLayoutId;
96 CFbAllLayout *pFbAllLayout;
97 //CFbPhotoLayout *pFbPhotoLayout;
98 //CFbMusicLayout *pFbMusicLayout;
99 //CFbVideoLayout *pFbVideoLayout;
104 memset(eoBtnGroup, 0, sizeof(eoBtnGroup));
105 pHandlerBase = new CHandlerBase(this);
106 for (a = 0; a < TOTAL_TOP_BTNS; a++)
107 pHandlerButton[a] = new CHandlerButton(this);
108 for (a = 0; a < TOTAL_GROUP_BTNS; a++){
109 pHandlerGroup[a] = new CHandlerGroup(this);
112 virtual ~SFbBaseView() {
116 for (a = 0; a < TOTAL_TOP_BTNS; a++)
117 delete pHandlerButton[a];
118 for (a = 0; a < TOTAL_GROUP_BTNS; a++)
119 delete pHandlerGroup[a];
122 class CHandlerBase : public CListenerMgr, public IKeyDownListener {
126 CHandlerBase(SFbBaseView *ins) : IKeyDownListener(this) { m = ins; }
128 virtual void OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev) {
129 if (!strcmp(ev->keyname, KEY_EXIT))
131 else if (!strcmp(ev->keyname, KEY_ENTER)) {
132 if (elm_object_focus_get(m->eoSelectedBtnGroup)) {
133 m->pFbAllLayout->SetFocus(EINA_TRUE);
134 // TODO: Each layout SetFocus???
140 class CHandlerButton : public CListenerMgr, protected IKeyDownListener, IMouseMoveListener, IMouseClickedListener {
144 static void sm_CbCtxPopupSelected(void* cookie, CCtxPopup* instance, const char* text)
146 SFbBaseView* m = (SFbBaseView*)cookie;
150 _DBG(" instance->Type(): %d", instance->Type());
151 switch (instance->Type()) {
152 case CCtxPopup::TOPBTN_SORT:
153 elm_object_text_set(m->eoBtnSort, text);
155 m->pFbAllLayout->Update(true);
157 m->pLayoutMgr->Show(Current_layout);
161 case CCtxPopup::TOPBTN_SOURCE:
162 elm_object_text_set(m->eoBtnSource, text);
164 m->pFbAllLayout->Update(false);
166 m->pLayoutMgr->Show(Current_layout);
176 CHandlerButton(SFbBaseView *ins) : IKeyDownListener(this), IMouseMoveListener(this), IMouseClickedListener(this) { m = ins; }
178 virtual void OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev) {
179 if (!strcmp(ev->keyname, KEY_BACK))
180 elm_object_focus_set(m->eoSelectedBtnGroup, EINA_TRUE);
182 virtual void OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev) {
183 if (!elm_object_focus_get(obj))
184 elm_object_focus_set(obj, EINA_TRUE);
186 virtual void OnMouseClicked(int id, Evas_Object *obj) {
187 CSourceCtxPopup::SCallback cb;
189 cb.onSelected = sm_CbCtxPopupSelected;
191 if (obj == m->eoBtnSource) {
192 CSourceCtxPopup* pCtxPopup = new CSourceCtxPopup;
193 m->pCtxPopup = pCtxPopup;
194 pCtxPopup->Create(m->eoBase, &cb);
196 else if (obj == m->eoBtnSort) {
197 CSortCtxPopup* pCtxPopup = new CSortCtxPopup;
198 m->pCtxPopup = pCtxPopup;
199 pCtxPopup->Create(m->eoBase, &cb);
202 } *pHandlerButton[TOTAL_TOP_BTNS];
204 class CHandlerGroup : public CListenerMgr, IMouseMoveListener, IKeyDownListener, IMouseClickedListener {
208 CHandlerGroup(SFbBaseView *ins) :
209 IMouseMoveListener(this),
210 IKeyDownListener(this),
211 IMouseClickedListener(this) { m = ins; }
213 virtual void OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev) {
214 if (!elm_object_focus_get(obj))
215 elm_object_focus_set(obj, EINA_TRUE);
217 virtual void OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev) {
218 if (!strcmp(ev->keyname, KEY_BACK))
221 virtual void OnMouseClicked(int id, Evas_Object *obj) {
222 if (m->eoSelectedBtnGroup == obj)
225 elm_object_signal_emit(m->eoSelectedBtnGroup, FBR_SIGNAL_GROUP_UNSELECTED, "");
226 m->eoSelectedBtnGroup = obj;
227 elm_object_signal_emit(m->eoSelectedBtnGroup, FBR_SIGNAL_GROUP_SELECTED, "");
230 m->pFbAllLayout->Update(false);
231 // TODO: not update, it should be "Show" as each layout
236 m->pLayoutMgr->Show(FB_ALL_LAYOUT);
239 m->pLayoutMgr->Show(FB_PHOTO_LAYOUT);
242 m->pLayoutMgr->Show(FB_VIDEO_LAYOUT);
245 m->pLayoutMgr->Show(FB_MUSIC_LAYOUT);
248 _DBG("Fix it: it can not make it , MouseClicked");
254 } *pHandlerGroup[TOTAL_GROUP_BTNS];
259 Evas_Object *_add_button(Evas_Object *box)
266 button = elm_button_add(box);
270 evas_object_size_hint_weight_set(button,
271 EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
272 evas_object_show(button);
277 void CFbBaseView::UpdateEmptyFocusSequence(void)
282 for (i = 0; i < TOTAL_GROUP_BTNS; i++)
283 elm_object_focus_next_object_set(m->eoBtnGroup[i], m->eoBtnSort, ELM_FOCUS_RIGHT);
285 elm_object_focus_next_object_set(m->eoBtnGroup[E_GRP_ALL], m->eoBtnSort, ELM_FOCUS_UP);
286 elm_object_focus_next_object_set(m->eoBtnSort, m->eoBtnGroup[E_GRP_ALL], ELM_FOCUS_DOWN);
287 elm_object_focus_next_object_set(m->eoBtnSource, m->eoBtnGroup[E_GRP_ALL], ELM_FOCUS_DOWN);
289 if (t_SelectedGroupButton() == m->eoBtnGroup[E_GRP_ALL]) {
290 elm_object_part_text_set(m->eoBase, FBR_PART_NO_CONTENT, _(NO_FILE_MESSAGE));
291 elm_object_part_text_set(m->eoBase, FBR_PART_NO_CONTENT_SUB, _(NO_FILE_MESSAGE_SUB));
293 else if (t_SelectedGroupButton() == m->eoBtnGroup[E_GRP_PHOTO]) {
294 elm_object_part_text_set(m->eoBase, FBR_PART_NO_CONTENT, _(NO_PHOTO_MESSAGE));
295 elm_object_part_text_set(m->eoBase, FBR_PART_NO_CONTENT_SUB, _(NO_PHOTO_MESSAGE_SUB));
297 else if (t_SelectedGroupButton() == m->eoBtnGroup[E_GRP_VIDEO]) {
298 elm_object_part_text_set(m->eoBase, FBR_PART_NO_CONTENT, _(NO_VIDEO_MESSAGE));
299 elm_object_part_text_set(m->eoBase, FBR_PART_NO_CONTENT_SUB, _(NO_VIDEO_MESSAGE_SUB));
301 else if (t_SelectedGroupButton() == m->eoBtnGroup[E_GRP_MUSIC]) {
302 elm_object_part_text_set(m->eoBase, FBR_PART_NO_CONTENT, _(NO_MUSIC_MESSAGE));
303 elm_object_part_text_set(m->eoBase, FBR_PART_NO_CONTENT_SUB, _(NO_MUSIC_MESSAGE_SUB));
307 void CFbBaseView::UnsetFocus(void)
309 elm_object_focus_set(t_SelectedGroupButton(), EINA_TRUE);
312 void CFbBaseView::CbLinkApp(int type, int source_type, char *path)
317 args = bundle_create();
319 _ERR("unable to create bundle");
323 bundle_add(args, PARAM_SOURCE, source_arg[source_type]);
324 bundle_add(args, PARAM_URI, path);
326 r = aul_launch_app(linked_app[type], args);
330 _ERR(" Unable to launch linked app");
337 void CFbBaseView::UpdatedGrid(void)
341 for (i = 0; i < TOTAL_GROUP_BTNS; i++)
342 elm_object_focus_next_object_set(m->eoBtnGroup[i],
343 m->pFbAllLayout->Grid(), ELM_FOCUS_RIGHT);
345 elm_object_focus_next_object_set(m->eoBtnGroup[E_GRP_ALL],
346 m->eoBtnSort, ELM_FOCUS_UP);
347 elm_object_focus_next_object_set(m->eoBtnSort,
348 m->eoBtnGroup[E_GRP_ALL], ELM_FOCUS_LEFT);
349 elm_object_focus_next_object_set(m->eoBtnSort,
350 m->pFbAllLayout->Grid(), ELM_FOCUS_DOWN);
351 elm_object_focus_next_object_set(m->eoBtnSource,
352 m->pFbAllLayout->Grid(), ELM_FOCUS_DOWN);
354 elm_object_part_text_set(m->eoBase, FBR_PART_NO_CONTENT, "");
355 elm_object_part_text_set(m->eoBase, FBR_PART_NO_CONTENT_SUB, "");
358 void CFbBaseView::t_CreateTopSession(void)
363 struct _btn_info btninfo[TOTAL_TOP_BTNS];
364 btninfo[TOPBTN_SOURCE].style = FBR_STYLE_SOURCE_BTN;
365 btninfo[TOPBTN_SOURCE].part = FBR_PART_SOURCE_HOVERSEL;
367 btninfo[TOPBTN_SORT].style = FBR_STYLE_SORT_BTN;
368 btninfo[TOPBTN_SORT].part = FBR_PART_SORT_HOVERSEL;
370 elm_object_part_text_set(m->eoBase, FBR_PART_TITLE,
373 for (i = 0; i < TOTAL_TOP_BTNS; i++) {
374 btn = _add_button(m->eoBase);
376 _ERR(" Adding btn failed ");
380 elm_object_style_set(btn, btninfo[i].style);
381 elm_object_part_content_set(m->eoBase, btninfo[i].part, btn);
383 m->pHandlerButton[i]->Connect(btn);
385 if (i == TOPBTN_SOURCE)
386 m->eoBtnSource = btn;
387 else if (i == TOPBTN_SORT)
391 elm_object_text_set(m->eoBtnSource, _(CSourceCtxPopup::SourceText(CInfo::SourceType())));
392 elm_object_text_set(m->eoBtnSort, _(CSortCtxPopup::SortText(CInfo::SortType())));
395 void CFbBaseView::t_CreateLeftSession(void)
398 Evas_Object *box, *ic;
400 char buf[MAX_LENGTH];
401 static struct _btn_info btninfo[TOTAL_GROUP_BTNS];
402 btninfo[E_GRP_ALL].txt = N_("ALL");
403 btninfo[E_GRP_ALL].icon_path = FBR_IMAGE_GRPBTN_ALL;
404 btninfo[E_GRP_PHOTO].txt = N_("PHOTO");
405 btninfo[E_GRP_PHOTO].icon_path = FBR_IMAGE_GRPBTN_PHOTO;
406 btninfo[E_GRP_VIDEO].txt = N_("VIDEO");
407 btninfo[E_GRP_VIDEO].icon_path = FBR_IMAGE_GRPBTN_VIDEO;
408 btninfo[E_GRP_MUSIC].txt = N_("MUSIC");
409 btninfo[E_GRP_MUSIC].icon_path = FBR_IMAGE_GRPBTN_MUSIC;
411 box = elm_box_add(m->eoBase);
414 evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
415 evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL);
416 evas_object_show(box);
418 for (i = 0; i < TOTAL_GROUP_BTNS; i++) {
419 m->eoBtnGroup[i] = _add_button(box);
420 if (!m->eoBtnGroup[i]) {
421 _ERR(" failed to add button to box ");
425 elm_box_pack_end(box, m->eoBtnGroup[i]);
426 elm_object_style_set(m->eoBtnGroup[i], FBR_STYLE_GROUPBTN);
427 elm_object_text_set(m->eoBtnGroup[i], _(btninfo[i].txt));
429 m->pHandlerGroup[i]->Connect(m->eoBtnGroup[i], i);
431 ic = elm_image_add(m->eoBtnGroup[i]);
436 snprintf(buf, sizeof(buf), "%s/%s", IMAGEDIR,
437 btninfo[i].icon_path);
438 elm_image_file_set(ic, buf, NULL);
439 elm_object_part_content_set(m->eoBtnGroup[i],
440 FBR_PART_ELM_SWALLOWICON, ic);
444 t_SetSelectedGroupButton(m->eoBtnGroup[E_GRP_ALL]);
447 elm_object_signal_emit(m->eoBtnGroup[E_GRP_ALL],
448 FBR_SIGNAL_GROUP_SELECTED, "");
449 elm_object_focus_set(m->eoBtnGroup[E_GRP_ALL], EINA_TRUE);
450 elm_object_part_content_set(m->eoBase, FBR_PART_GROUPBTN_BOX, box);
453 void CFbBaseView::t_CreateFullView(void)
455 t_CreateTopSession();
456 t_CreateLeftSession();
457 _DBG("UpdateLayout");
459 m->pFbAllLayout->Update(false);
461 m->pLayoutMgr->Show(Current_layout);
465 void CFbBaseView::t_SetSelectedGroupButton(Evas_Object* obj)
467 m->eoSelectedBtnGroup = obj;
471 for (a = 0; a < TOTAL_GROUP_BTNS; a++) {
472 if (m->eoBtnGroup[a] == obj)
475 CInfo::SetGroupIndex(idx);
478 Evas_Object* CFbBaseView::t_SelectedGroupButton(void)
480 return m->eoSelectedBtnGroup;
483 void CFbBaseView::t_OnShow(void)
487 evas_object_show(m->eoBase);
489 CBaseView::t_OnShow();
492 void CFbBaseView::t_OnUpdate(void *data)
494 // TODO: When does this function is called? If it don't be used, Remove it.
496 m->pFbAllLayout->Action();
499 void CFbBaseView::t_OnHide(void)
501 evas_object_hide(m->eoBase);
503 CBaseView::t_OnHide();
506 bool CFbBaseView::Create(void *data)
510 Evas_Object *eoWin = CViewMgr::GetInstance()->Window();
511 Evas_Object *eoBase = NULL;
513 int source_type = E_ALL;
516 _CHECK(m = new SFbBaseView)
517 _CHECK(eoBase = elm_layout_add(eoWin))
518 _CHECK(elm_layout_file_set(eoBase, EDJEFILE, FBR_BASE_VIEW))
520 evas_object_size_hint_weight_set(eoBase, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
521 elm_win_resize_object_add(eoWin, eoBase);
523 /* get the source_type using 'data' string */
527 int arrsize = ARRAY_SIZE(source_arg);
528 for (i = 0; i < arrsize; i++) {
529 if (source_arg[i] && !strcmp(source_arg[i], (const char*)data)) {
534 if (source_type < E_ALL || source_type > E_USB)
536 CInfo::SetSourceType(source_type);
541 _CHECK(m->pLayoutMgr = new CLayoutMgr)
542 _CHECK(m->pLayoutMgr->Create(eoBase, NULL))
543 _CHECK(m->pFbAllLayout = new CFbAllLayout(FB_ALL_LAYOUT))
544 //_CHECK(m->pFbPhotoLayout = new CFbPhotoLayout(FB_PHOTO_LAYOUT))
545 //_CHECK(m->pFbVideoLayout = new CFbVideoLayout(FB_VIDEO_LAYOUT))
546 //_CHECK(m->pFbMusicLayout = new CFbMusicLayout(FB_MUSIC_LAYOUT))
547 _CHECK(m->pFbAllLayout->Create(m->pLayoutMgr, NULL))
548 //_CHECK(m->pFbPhotoLayout->Create(m->pLayoutMgr, NULL))
549 //_CHECK(m->pFbVideoLayout->Create(m->pLayoutMgr, NULL))
550 //_CHECK(m->pFbMusicLayout->Create(m->pLayoutMgr, NULL))
551 _CHECK(m->pLayoutMgr->AddLayout(m->pFbAllLayout))
552 //_CHECK(m->pLayoutMgr->AddLayout(m->pFbPhotoLayout))
553 //_CHECK(m->pLayoutMgr->AddLayout(m->pFbVideoLayout))
554 //_CHECK(m->pLayoutMgr->AddLayout(m->pFbMusicLayout))
555 _CHECK(CUsbConnectionListener::Create())
556 _CHECK(CMediaContentDbUpdateListener::Create())
560 _CHECK_FAIL{ CMediaContentDbUpdateListener::Destroy(); }
561 _CHECK_FAIL{ CUsbConnectionListener::Destroy(); }
562 //_CHECK_FAIL{ m->pLayoutMgr->RemoveLayout(m->pFbMusicLayout); }
563 //_CHECK_FAIL{ m->pLayoutMgr->RemoveLayout(m->pFbVideoLayout); }
564 //_CHECK_FAIL{ m->pLayoutMgr->RemoveLayout(m->pFbPhotoLayout); }
565 _CHECK_FAIL{ m->pLayoutMgr->RemoveLayout(m->pFbAllLayout); }
566 //_CHECK_FAIL{ m->pFbMusicLayout->Destroy(); }
567 //_CHECK_FAIL{ m->pFbVideoLayout->Destroy(); }
568 //_CHECK_FAIL{ m->pFbPhotoLayout->Destroy(); }
569 _CHECK_FAIL{ m->pFbAllLayout->Destroy(); }
570 //_CHECK_FAIL{ delete m->pFbMusicLayout; m->pFbMusicLayout = NULL; }
571 //_CHECK_FAIL{ delete m->pFbVideoLayout; m->pFbVideoLayout = NULL; }
572 //_CHECK_FAIL{ delete m->pFbPhotoLayout; m->pFbPhotoLayout = NULL; }
573 _CHECK_FAIL{ delete m->pFbAllLayout; m->pFbAllLayout = NULL; }
574 _CHECK_FAIL{ m->pLayoutMgr->Destroy(); }
575 _CHECK_FAIL{ delete m->pLayoutMgr; m->pLayoutMgr = NULL; }
576 _CHECK_FAIL{ /* elm_layout_file_set*/ }
577 _CHECK_FAIL{ evas_object_del(eoBase); }
578 _CHECK_FAIL{ delete m; m = NULL; }
579 } _CREATE_END_AND_CATCH{ return false; }
582 // original create grid
583 CInfo::SetSortType(0/*CSort::SORT_NAME_AZ*/);
584 evas_object_data_set(eoBase, BASE_VIEW_DATA, this);
585 m->pLayoutMgr->Show(FB_ALL_LAYOUT);
587 elm_object_focus_allow_set(eoBase, EINA_FALSE);
588 m->pHandlerBase->Connect(eoBase);
589 CBaseView::Create(NULL);
593 void CFbBaseView::Destroy(void)
597 CBaseView::Destroy();
598 CMediaContentDbUpdateListener::Destroy();
599 CUsbConnectionListener::Destroy();
602 m->pLayoutMgr->RemoveLayout(m->pFbMusicLayout);
603 m->pFbMusicLayout->Destroy();
604 delete m->pFbMusicLayout;
606 m->pLayoutMgr->RemoveLayout(m->pFbVideoLayout);
607 m->pFbVideoLayout->Destroy();
608 delete m->pFbVideoLayout;
610 m->pLayoutMgr->RemoveLayout(m->pFbPhotoLayout);
611 m->pFbPhotoLayout->Destroy();
612 delete m->pFbPhotoLayout;
615 m->pLayoutMgr->RemoveLayout(m->pFbAllLayout);
616 m->pFbAllLayout->Destroy();
617 delete m->pFbAllLayout;
619 m->pLayoutMgr->Destroy();
620 delete m->pLayoutMgr;
622 evas_object_del(m->eoBase);
629 Evas_Object* CFbBaseView::Base(void)
637 void CFbBaseView::OnConnect(void)
639 m->pPopup = new CPopup;
642 if (!m->pPopup->Create(m->eoBase)) {
648 if (CInfo::SourceType() == E_USB) {
649 if (!FlagConnected()) {
650 CInfo::SetSourceType(E_ALL);
651 elm_object_text_set(m->eoBtnSource,
652 _(CSourceCtxPopup::SourceText(CInfo::SourceType())));
658 void CFbBaseView::OnUpdated(const SEntity *entity)
661 m->pPopup->Destroy();
666 m->pCtxPopup->Destroy();
670 if (CInfo::SourceType() != E_TV) {
672 m->pFbAllLayout->Update(false);
674 m->pLayoutMgr->Show(Current_layout);
676 elm_object_focus_set(t_SelectedGroupButton(), EINA_TRUE);