2 * Copyright 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://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.
18 #include <minicontrol-provider.h>
19 #include "mp-minicontroller.h"
20 #include "mp-player-control.h"
23 #include "mp-player-mgr.h"
25 #include "mp-widget.h"
26 #include "mp-setting-ctrl.h"
28 #define MINI_CONTROLLER_WIDTH (720)
29 #define MINI_CONTROLLER_WIDTH_LANDSCAPE (1280)
30 #define MINI_CONTROLLER_HEIGHT (170)
31 #define WL_INDI_H 27 //Window Layout Indicator Height
32 #define PAUSE_TIME_OUT 120
34 #define CTR_EDJ_SIG_SRC "ctrl_edj"
35 #define CTR_PROG_SIG_SRC "ctrl_prog"
37 #define BUFFER_MAX 256
39 static void _minicontroller_action_cb(void *data, Evas_Object * obj, const char *emission, const char *source);
40 static Evas_Object *_load_edj(Evas_Object * parent, const char *file, const char *group);
41 static Evas_Object *_create_bgimg(Evas_Object * parent);
42 static Evas_Object *_load_minicontroller(struct appdata *ad);
45 _mp_minicontroller_update_elapsed_time(struct appdata *ad)
48 MP_CHECK(ad->minicontroller_layout);
51 int sec = mp_player_mgr_get_position() / 1000;
55 char *time_text = g_strdup_printf("%02d:%02d", min, sec);
57 edje_object_part_text_set(_EDJ(ad->minicontroller_layout), "elm.elapsed_time", time_text);
64 _minicontroller_update_progresstime_cb(void *data)
66 struct appdata *ad = data;
67 mp_retvm_if(ad == NULL, ECORE_CALLBACK_CANCEL, "appdata is NULL");
69 if (ad->player_state == PLAY_STATE_PLAYING)
71 _mp_minicontroller_update_elapsed_time(ad);
74 return ECORE_CALLBACK_RENEW;
78 _minicontroller_progress_timer_add(void *data)
80 struct appdata *ad = data;
81 mp_retm_if(ad == NULL, "appdata is NULL");
84 mp_ecore_timer_del(ad->minicon_progress_timer);
86 _mp_minicontroller_update_elapsed_time(ad);
87 if (ad->player_state == PLAY_STATE_PLAYING)
88 ad->minicon_progress_timer = ecore_timer_add(1.0, _minicontroller_update_progresstime_cb, ad);
92 _minicontroller_action_cb(void *data, Evas_Object * obj, const char *emission, const char *source)
94 DEBUG_TRACE("emission: %s, source: %s\n", emission, source);
96 struct appdata *ad = (struct appdata *)data;
97 mp_retm_if(ad == NULL, "appdata is NULL");
102 if (strcmp(source, "rew_btn_down") == 0)
105 mp_play_control_rew_cb(data, obj, "rew_btn_down", CTR_EDJ_SIG_SRC);
108 else if (strcmp(source, "rew_btn_up") == 0)
110 DEBUG_TRACE("REW_up");
111 mp_play_control_rew_cb(data, obj, "rew_btn_up", CTR_EDJ_SIG_SRC);
115 else if (strcmp(source, "play") == 0)
118 if (ad->minicon_timer) //Destroy the Hide out Timer.
120 ecore_timer_del(ad->minicon_timer);
121 ad->minicon_timer = NULL;
123 if (ad->player_state == PLAY_STATE_PLAYING)
125 mp_play_control_play_pause(data, obj, SIGNAL_PAUSE, source);
126 edje_object_signal_emit(elm_layout_edje_get(ad->minicontroller_layout), "set_pause",
131 mp_play_control_play_pause(data, obj, SIGNAL_PLAY, source);
132 edje_object_signal_emit(elm_layout_edje_get(ad->minicontroller_layout), "set_play",
138 else if (strcmp(source, "ff_btn_down") == 0)
140 DEBUG_TRACE("FWD_down");
141 mp_play_control_ff_cb(data, obj, "ff_btn_down", CTR_EDJ_SIG_SRC);
144 else if (strcmp(source, "ff_btn_up") == 0)
146 DEBUG_TRACE("FWD_up");
147 mp_play_control_ff_cb(data, obj, "ff_btn_up", CTR_EDJ_SIG_SRC);
151 else if (!g_strcmp0(source, "repeat"))
153 DEBUG_TRACE("REPEAT");
154 int repeat_state = 0;
155 mp_setting_get_repeat_state(&repeat_state);
158 ad->play_rep_state = repeat_state;
159 mp_setting_set_repeat_state(repeat_state);
160 mp_play_control_repeat_set(ad, repeat_state);
162 else if (!g_strcmp0(source, "shuffle"))
164 DEBUG_TRACE("SHUFFLE");
165 int shuffle_state = 0;
166 mp_setting_get_shuffle_state(&shuffle_state);
167 shuffle_state = !shuffle_state;
168 ad->play_shuffle_state = shuffle_state;
169 mp_setting_set_shuffle_state(shuffle_state);
170 mp_play_control_shuffle_set(ad, shuffle_state);
172 else if (strcmp(source, "albumart") == 0)
174 //mp_minicontroller_destroy(ad);
175 DEBUG_TRACE("albumart");
176 ad->load_play_view = true;
177 elm_win_activate(ad->win_main);
180 mp_minicontroller_update(ad);
189 _load_edj(Evas_Object * parent, const char *file, const char *group)
194 eo = elm_layout_add(parent);
197 r = elm_layout_file_set(eo, file, group);
203 evas_object_size_hint_weight_set(eo, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
204 elm_win_resize_object_add(parent, eo);
205 evas_object_show(eo);
212 _create_bgimg(Evas_Object * parent)
216 mp_retvm_if(parent == NULL, NULL, "parent is NULL");
220 bg = elm_bg_add(parent);
221 evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
222 elm_win_resize_object_add(parent, bg);
223 evas_object_color_set(bg, 37, 37, 37, 255);
224 evas_object_show(bg);
230 _load_minicontroller(struct appdata *ad)
233 mp_retvm_if(ad == NULL, NULL, "appdata is NULL");
234 Evas_Object *win = NULL;
235 Evas_Object *eo = NULL;
236 Evas_Object *icon = NULL;
238 win = minicontrol_win_add("musicplayer-mini");
242 double scale = elm_config_scale_get();
243 evas_object_resize(win, MINI_CONTROLLER_WIDTH * scale, MINI_CONTROLLER_HEIGHT * scale);
246 ad->win_minicon = win;
249 eo = _load_edj(win, MINICON_EDJ_NAME, "music-minicontroller");
253 icon = elm_icon_add(eo);
254 ad->minicon_icon = icon;
255 edje_object_signal_callback_add(_EDJ(eo), "clicked", "*", _minicontroller_action_cb, ad);
257 evas_object_show(win);
258 //evas_object_show(eo);
264 mp_minicontroller_create(struct appdata *ad)
267 mp_retvm_if(ad == NULL, -1, "appdata is NULL");
269 if (!(ad->minicontroller_layout && ad->win_minicon))
271 ad->minicontroller_layout = _load_minicontroller(ad);
272 if (ad->minicontroller_layout == NULL)
274 DEBUG_TRACE("ERROR");
280 mp_minicontroller_show(ad);
286 mp_minicontroller_show(struct appdata *ad)
288 DEBUG_TRACE("minicontroller view show!!");
289 mp_retvm_if(ad == NULL, -1, "appdata is NULL");
291 ad->b_minicontroller_show = TRUE;
292 mp_minicontroller_update(ad);
293 evas_object_show(ad->win_minicon);
299 mp_minicontroller_update(struct appdata *ad)
303 mp_retm_if(ad == NULL, "appdata is NULL");
305 if (ad->player_state == PLAY_STATE_PLAYING)
307 edje_object_signal_emit(elm_layout_edje_get(ad->minicontroller_layout), "set_pause", "play.pause.image");
309 if (ad->minicon_visible)
310 _minicontroller_progress_timer_add(ad);
314 edje_object_signal_emit(elm_layout_edje_get(ad->minicontroller_layout), "set_play",
318 if (ad->playing_list) {
319 music_list_item *current_item = mp_play_list_get_current_item(ad->playing_list);
320 MP_CHECK(current_item);
321 DEBUG_TRACE("album art is %s", current_item->albumart);
322 if (strlen(current_item->album) > 0 && mp_util_is_image_valid(ad->evas, current_item->albumart))
323 elm_icon_file_set(ad->minicon_icon, current_item->albumart, NULL);
325 elm_icon_file_set(ad->minicon_icon, DEFAULT_THUMBNAIL, NULL);
326 edje_object_part_swallow(_EDJ(ad->minicontroller_layout), "albumart_image", ad->minicon_icon);
327 edje_object_part_text_set(_EDJ(ad->minicontroller_layout), "elm.text", current_item->title);
328 edje_object_part_text_set(_EDJ(ad->minicontroller_layout), "elm.text.2", current_item->artist);
330 if (!ad->minicon_progress_timer)
331 _mp_minicontroller_update_elapsed_time(ad);
333 const char *signal = NULL;
335 int repeat_state = 0;
336 mp_setting_get_repeat_state(&repeat_state);
337 if (repeat_state == MP_SETTING_REP_ALL)
338 signal = "set_repeat_all";
339 else if (repeat_state == MP_SETTING_REP_1)
340 signal = "set_repeat_one";
342 signal = "set_repeat_none";
343 edje_object_signal_emit(_EDJ(ad->minicontroller_layout), signal, "c_source");
346 int shuffle_state = false;
347 mp_setting_get_shuffle_state(&shuffle_state);
349 signal = "set_shuffle_on";
351 signal = "set_shuffle_off";
352 edje_object_signal_emit(_EDJ(ad->minicontroller_layout), signal, "c_source");
354 evas_object_show(ad->minicontroller_layout);
359 mp_minicontroller_hide(struct appdata *ad)
361 DEBUG_TRACE("minicontroller view hide!!\n");
362 mp_retvm_if(ad == NULL, -1, "appdata is NULL");
364 evas_object_hide(ad->win_minicon);
365 ad->b_minicontroller_show = FALSE;
367 if (ad->minicon_timer)
369 ecore_timer_del(ad->minicon_timer);
370 ad->minicon_timer = NULL;
373 if (ad->minicon_progress_timer)
375 ecore_timer_del(ad->minicon_progress_timer);
376 ad->minicon_progress_timer = NULL;
384 mp_minicontroller_destroy(struct appdata *ad)
386 DEBUG_TRACE("minicontroller view destroy!!");
387 mp_retvm_if(ad == NULL, -1, "appdata is NULL");
389 if (ad->minicontroller_layout != NULL)
391 evas_object_hide(ad->minicontroller_layout);
392 evas_object_del(ad->minicontroller_layout);
393 ad->minicontroller_layout = NULL;
394 ad->b_minicontroller_show = FALSE;
399 evas_object_del(ad->win_minicon);
400 ad->win_minicon = NULL;
403 ad->minicon_visible = false;
409 mp_minicontroller_rotate(struct appdata *ad, int angle)
414 const char *signal = NULL;
415 if (angle == 90 || angle == 270) {
416 signal = "sig_set_landscape_mode";
417 w = MINI_CONTROLLER_WIDTH_LANDSCAPE;
419 signal = "sig_set_portrait_mode";
420 w = MINI_CONTROLLER_WIDTH;
423 edje_object_signal_emit(_EDJ(ad->minicontroller_layout), signal, "c_source");
425 double scale = elm_scale_get();
426 evas_object_resize(ad->win_minicon, w * scale, MINI_CONTROLLER_HEIGHT * scale);
427 elm_win_rotation_with_resize_set(ad->win_minicon, angle);
431 mp_minicontroller_visible_set(struct appdata *ad, bool visible)
435 ad->minicon_visible = visible;
438 _minicontroller_progress_timer_add(ad);
443 mp_ecore_timer_del(ad->minicon_progress_timer);