3 * Copyright 2012 Samsung Electronics Co., Ltd
5 * Licensed under the Flora License, Version 1.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://www.tizenopensource.org/license
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
20 #include "ring_view_main.h"
21 #include "ring_fwk_util.h"
22 #include "ring_fwk_vconf.h"
24 #include <mm_session_private.h>
26 /**********************************************************************
27 ******************define, struct ,typedef, union, enum, global val *************************************
28 ***********************************************************************/
30 /**********************************************************************
31 ******************Local function declear, extern function declear*************************************
32 ***********************************************************************/
33 static void _ring_key_event_init(struct appdata *ad);
34 static void _ring_key_event_fini(struct appdata *ad);
35 static Eina_Bool _ring_key_down_cb(void *data, int type, void *event);
37 static int _ring_mgr_cb_func(alarm_id_t alarm_id, void *data);
39 void _ring_init_motion_sensor(struct appdata *ad);
40 void _ring_deinit_motion_sensor(struct appdata *ad);
41 static void _ring_motion_sensor_callback_func(unsigned int type, sensor_event_data_t *event, void *data);
43 static int ring_app_create(void *data);
44 static int ring_app_terminate(void *data);
45 static int ring_app_pause(void *data);
46 static int ring_app_resume(void *data);
47 static int ring_app_reset(service_h b, void *data);
48 static int ring_app_low_memory(void *data);
49 static int ring_app_low_battery(void *data);
50 static int ring_app_lang_change(void *data);
52 /**********************************************************************
53 ******************Global val , static global val*************************************
54 ***********************************************************************/
56 static struct appdata g_alarm_ring_ad;
58 static struct text_part main_txt[] = {
59 {"txt_title", N_("Application template"),},
60 {"txt_mesg", N_("Click to exit"),},
63 /**********************************************************************
64 ******************Local function ref*************************************
65 ***********************************************************************/
69 * This function is used to init key event
70 * @param data[in] pointer to struct appdata
74 static void _ring_key_event_init(struct appdata *ad)
76 retm_if(!ad, "ad null");
77 Display *disp = ecore_x_display_get();
78 Window win = elm_win_xwindow_get(ad->win_main);
79 utilx_grab_key(disp, win, KEY_SEND, TOP_POSITION_GRAB);
80 utilx_grab_key(disp, win, KEY_SELECT, TOP_POSITION_GRAB);
81 utilx_grab_key(disp, win, KEY_END, TOP_POSITION_GRAB);
83 ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, _ring_key_down_cb,
87 static void _ring_key_event_fini(struct appdata *ad)
89 retm_if(!ad, "ad null");
90 Display *disp = ecore_x_display_get();
91 Window win = elm_win_xwindow_get(ad->win_main);
92 utilx_ungrab_key(disp, win, KEY_SELECT);
93 utilx_ungrab_key(disp, win, KEY_SEND);
94 utilx_ungrab_key(disp, win, KEY_END);
95 ECORE_EVENT_HANDLER_DELIF(ad->ecore_handler);
100 * This function is used to handle key down cb
101 * @param data[in] pointer to data
102 * @param type[in] int type
103 * @param event[in] pointer to event
104 * @return when success, return EINA_TRUE or EINA_FALSE if error
107 static Eina_Bool _ring_key_down_cb(void *data, int type, void *event)
109 retvm_if(!data, ECORE_CALLBACK_CANCEL, "data is null");
110 retvm_if(!event, ECORE_CALLBACK_CANCEL, "event is null");
111 struct appdata *ad = (struct appdata *)data;
112 Evas_Event_Key_Up *ev = event;
114 retvm_if(!ev->keyname, ECORE_CALLBACK_CANCEL, "ev->keyname is null");
115 retvm_if(!ad->data_s, ECORE_CALLBACK_CANCEL, "ad->data_s is null");
116 if (IS_STR_EQUAL(ev->keyname, KEY_SEND)
117 || IS_STR_EQUAL(ev->keyname, KEY_SELECT)
118 || IS_STR_EQUAL(ev->keyname, KEY_END)) {
120 ring_util_get_exit_type(ad->data_s->repeat_once,
124 return ECORE_CALLBACK_CANCEL;
129 * This function is used to set alarmmgr_set_cb cb
130 * @param alarm_id[in] alarm_id_t
131 * @param data[in] pointer to data
132 * @return when success, return SUCCESS or FAILED if error
135 static int _ring_mgr_cb_func(alarm_id_t alarm_id, void *data)
137 retvm_if(!data, FAILED, "data null");
139 struct appdata *ad = (struct appdata *)data;
140 /*if ring have been created, just return SUCCESS*/
141 retv_if(ad->is_create, SUCCESS);
142 /*ring have been created*/
143 ad->is_create = EINA_TRUE;
145 ret = ring_util_data_get(ad, alarm_id);
146 if (ret != SUCCESS) {
150 appcore_set_i18n(PACKAGE, LOCALEDIR);
154 ring_app_lang_change(ad);
155 appcore_set_event_callback(APPCORE_EVENT_LOW_BATTERY,
156 ring_app_low_battery, ad);
157 appcore_set_event_callback(APPCORE_EVENT_LOW_MEMORY,
158 ring_app_low_memory, ad);
159 appcore_set_event_callback(APPCORE_EVENT_LANG_CHANGE,
160 ring_app_lang_change, ad);
161 _ring_key_event_init(ad);
164 if (SUCCESS != ret) {
170 static void _ring_motion_sensor_callback_func(unsigned int type, sensor_event_data_t *event, void *data)
172 int *motion_detect = NULL;
173 struct appdata *ad = (struct appdata *) data;
175 retm_if(type != MOTION_ENGINE_EVENT_TOP_TO_BOTTOM, "motion event is not top to bottom");
176 retm_if(event == NULL, "sensor event data is NULL");
178 motion_detect = (int *)(event->event_data);
180 if (*motion_detect == MOTION_ENGIEN_TOP_TO_BOTTOM_DETECTION) {
181 ad->id_exit_type = ring_util_get_exit_type(ad->data_s->repeat_once, ALARM_BTN_STOP);
185 _ring_deinit_motion_sensor(ad);
188 void _ring_init_motion_sensor(struct appdata *ad)
192 int motion_active = -1;
193 int turnover_active = -1;
195 retm_if(ad->motion_sensor_handle >= 0, "already initialized");
196 retm_if(0 != vconf_get_bool(VCONFKEY_SETAPPL_MOTION_ACTIVATION, &motion_active), "motion activation vconf key getting failed");
197 retm_if(0 != vconf_get_bool(VCONFKEY_SETAPPL_USE_TURN_OVER, &turnover_active), "turn over activation vconf key getting failed");
199 if (motion_active == 1 && turnover_active == 1) {
200 handle = sf_connect(MOTION_SENSOR);
201 retm_if(handle < 0, "sf_connect failed");
203 ret = sf_register_event(handle, MOTION_ENGINE_EVENT_TOP_TO_BOTTOM, NULL, _ring_motion_sensor_callback_func, ad);
204 retm_if(ret < 0, "sf_register_event failed");
206 ret = sf_start(handle, 0);
207 retm_if(ret < 0, "sensor_start fail");
209 ad->motion_sensor_handle = handle;
213 void _ring_deinit_motion_sensor(struct appdata *ad)
217 retm_if(ad->motion_sensor_handle < 0, "not initialized");
219 ret = sf_unregister_event(ad->motion_sensor_handle, MOTION_ENGINE_EVENT_TOP_TO_BOTTOM);
220 warn_if(ret < 0, "sf_unregister_event failed");
222 ret = sf_stop(ad->motion_sensor_handle);
223 warn_if(ret < 0, "sf_stop failed");
225 ret = sf_disconnect(ad->motion_sensor_handle);
226 warn_if(ret < 0, "sf_disconnect failed");
231 * This function is used to handle when create
232 * @param data[in] pointer to data
233 * @return when success, return SUCCESS or FAILED if error
236 static int ring_app_create(void *data)
238 retvm_if(!data, FAILED, "data null");
240 struct appdata *ad = (struct appdata *)data;
242 ad->is_create = EINA_FALSE;
243 nErr = alarmdb_init(NULL);
244 retvm_if(SUCCESS != nErr, FAILED, "alarmdb_init failed! return=%d\n",
246 nErr = alarmmgr_init(PKGNAME);
247 retvm_if(SUCCESS != nErr, FAILED, "alarmmgr_init failed! return=%d",
250 mm_session_init(MM_SESSION_TYPE_ALARM);
252 ring_util_state_get(ad);
253 nErr = alarmmgr_set_cb(_ring_mgr_cb_func, ad);
254 retvm_if(SUCCESS != nErr, FAILED, "alarmmgr_set_cb failed! return=%d",
256 _ring_init_motion_sensor(ad);
262 * This function is used to handle when terminate
263 * @param data[in] pointer to data
264 * @return when success, return SUCCESS or FAILED if error
267 static int ring_app_terminate(void *data)
269 struct appdata *ad = (struct appdata *)data;
270 ECORE_TIMER_DELIF(ad->timer);
271 ECORE_TIMER_DELIF(ad->lowbattery_timer);
273 ring_volume_stop_sound(ad);
275 ring_exit_data_handle(ad);
277 EVAS_OBJECT_DELIF(ad->layout_main);
278 EVAS_OBJECT_DELIF(ad->win_main);
279 _ring_key_event_fini(ad);
285 ring_util_power_state(ALARMRING_UNLOCK);
291 * This function is used to handle when resume
292 * @param data[in] pointer to data
293 * @return when success, return SUCCESS or FAILED if error
296 static int ring_app_resume(void *data)
298 //struct appdata *ad = data;
304 * This function is used to handle when pause
305 * @param data[in] pointer to data
306 * @return when success, return SUCCESS or FAILED if error
309 static int ring_app_pause(void *data)
311 // struct appdata *ad = data;
317 * This function is used to handle when reset
318 * @param b[in] pointer to bundle
319 * @param data[in] pointer to data
320 * @return when success, return SUCCESS or FAILED if error
323 static int ring_app_reset(service_h b, void *data)
325 struct appdata *ad = data;
327 elm_win_activate(ad->win_main);
334 * This function is used to handle when low memory
335 * @param data[in] pointer to data
336 * @return when success, return SUCCESS or FAILED if error
339 static int ring_app_low_memory(void *data)
346 * This function is used to handle when low battery
347 * @param data[in] pointer to data
348 * @return when success, return SUCCESS or FAILED if error
351 static int ring_app_low_battery(void *data)
358 * This function is used to handle when language changed
359 * @param data[in] pointer to data
360 * @return when success, return SUCCESS or FAILED if error
363 static int ring_app_lang_change(void *data)
365 struct appdata *ad = data;
366 if (ad->layout_main == NULL) {
369 update_ts(elm_layout_edje_get(ad->layout_main), main_txt,
370 sizeof(main_txt) / sizeof(main_txt[0]));
374 /**********************************************************************
375 ******************Global function ref*************************************
376 ***********************************************************************/
380 * This function is used to main()
381 * @param argc[in] int
382 * @param argv[in] pointer to char*
383 * @return when success, return SUCCESS or FAILED if error
386 int main(int argc, char *argv[])
388 struct appcore_ops ops = {
389 .create = ring_app_create,
390 .terminate = ring_app_terminate,
391 .pause = ring_app_pause,
392 .resume = ring_app_resume,
393 .reset = ring_app_reset,
395 memset(&g_alarm_ring_ad, 0x0, sizeof(struct appdata));
396 ops.data = &g_alarm_ring_ad;
397 g_alarm_ring_ad.motion_sensor_handle = -1;
398 return appcore_efl_main("alarm-ring", &argc, &argv, &ops);