4 * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
6 * Contact: Jayoun Lee <airjany@samsung.com>
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
23 #include <appcore-efl.h>
24 #include <ui-gadget.h>
31 #include "ug-client.h"
33 #include <tzplatform_config.h>
39 #define PATH_UG_LAUNCHER tzplatform_mkpath(TZ_SYS_BIN,"ug-launcher")
41 #define LOG_TAG "UI_GADGET_CLIENT"
43 static void prt_usage(const char *cmd)
45 fprintf(stderr, "Usage: %s [-f] [-F] -n <UG NAME> [-d <Arguments>]\n",
47 fprintf(stderr, " Options:\n");
48 fprintf(stderr, " -d argument\n");
49 fprintf(stderr, " -F Fullview mode (Default)\n");
50 fprintf(stderr, " -f Frameview mode\n");
51 fprintf(stderr, " Example:\n");
53 " %s -F -n helloUG-efl -d \"name,John Doe\" -d \"age,30\"\n",
58 static void win_del(void *data, Evas_Object *obj, void *event)
63 static void main_quit_cb(void *data, Evas_Object *obj,
64 const char *emission, const char *source)
69 static int ug_send_rotate_event(int angle)
72 LOGD("ug_send_rotate_event angle : %d", angle);
75 ret = ug_send_event(UG_EVENT_ROTATE_PORTRAIT);
78 ret = ug_send_event(UG_EVENT_ROTATE_LANDSCAPE_UPSIDEDOWN);
81 ret = ug_send_event(UG_EVENT_ROTATE_PORTRAIT_UPSIDEDOWN);
84 ret = ug_send_event(UG_EVENT_ROTATE_LANDSCAPE);
87 LOGW("wrong angle(%d) for send rotate event",angle);
94 static void rotate(void *data, Evas_Object *obj, void *event)
96 int changed_angle = 0;
97 struct appdata *ad = data;
99 changed_angle = elm_win_rotation_get((const Evas_Object *)obj);
100 if(changed_angle == -1) {
101 LOGE("elm_win_rotation_get error");
105 LOGD("rotate call back : changed angle(%d) / current angle(%d)",
106 changed_angle, ad->rotate);
108 if(ad->rotate != changed_angle) {
109 ug_send_rotate_event(changed_angle);
112 ad->rotate = changed_angle;
117 void _ug_client_layout_cb(ui_gadget_h ug, enum ug_mode mode, void *priv)
127 base = ug_get_layout(ug);
129 LOGE("base layout is null");
134 case UG_MODE_FULLVIEW:
135 evas_object_size_hint_weight_set(base, EVAS_HINT_EXPAND,
137 ug_disable_effect(ug);
138 elm_object_content_set(ad->ly_main, base);
139 evas_object_show(base);
141 case UG_MODE_FRAMEVIEW:
142 elm_object_part_content_set(ad->ly_main, "content", base);
149 void _ug_client_result_cb(ui_gadget_h ug, service_h reply, void *priv)
151 struct appdata *ad = NULL;
159 ret = service_get_extra_data (reply, UG_SERVICE_DATA_RESULT, &value);
160 if((ret == SERVICE_ERROR_NONE) && (value)) {
161 result = atoi(value);
162 LOGD("reply result is %d", result);
164 LOGW("get reply result error(%d) . result will be SERVICE_RESULT_SUCCEEDED", ret);
165 result = SERVICE_RESULT_SUCCEEDED;
170 LOGE("appdata is null");
174 ret = service_reply_to_launch_request(reply, ad->request, (service_result_e)result);
175 if (ret != SERVICE_ERROR_NONE)
176 LOGE("service_reply_to_launch_request failed, %d", ret);
179 void _ug_client_destroy_cb(ui_gadget_h ug, void *priv)
181 struct appdata *ad = NULL;
188 LOGE("appdata is null. win lower is fail");
190 LOGD("window lower");
191 elm_win_lower(ad->win);
197 void _ug_client_end_cb(ui_gadget_h ug, void *priv)
202 LOGD("_ug_client_end_cb invoked");
207 static void profile_changed_cb(void *data, Evas_Object * obj, void *event)
209 const char *profile = elm_config_profile_get();
211 LOGE("!!! profile_changed_cb(%s) !!!", profile);
213 if (strcmp(profile, "desktop") == 0)
214 elm_win_indicator_mode_set(obj, ELM_WIN_INDICATOR_HIDE);
217 static Evas_Object *create_win(const char *name)
223 eo = elm_win_add(NULL, name, ELM_WIN_BASIC);
225 elm_win_title_set(eo, name);
226 elm_win_conformant_set(eo, EINA_TRUE);
227 evas_object_smart_callback_add(eo, "delete,request",
229 /* disable destktop mode
230 evas_object_smart_callback_add(eo, "profile,changed", profile_changed_cb, NULL); */
231 ee = ecore_evas_ecore_evas_get(evas_object_evas_get(eo));
232 evas_output_size_get(ee, &w, &h);
233 evas_object_resize(eo, w, h);
235 elm_win_indicator_mode_set(eo,ELM_WIN_INDICATOR_SHOW);
241 static Evas_Object *_ug_client_load_edj(Evas_Object *parent, const char *file,
246 eo = elm_layout_add(parent);
248 r = elm_layout_file_set(eo, file, group);
253 evas_object_size_hint_weight_set(eo,
260 static int low_memory(void *data)
262 return ug_send_event(UG_EVENT_LOW_MEMORY);
265 static int low_battery(void *data)
267 return ug_send_event(UG_EVENT_LOW_BATTERY);
270 static int lang_changed(void *data)
274 lang = vconf_get_str(VCONFKEY_LANGSET);
276 LOGD("lang : %s", lang);
277 elm_language_set((const char*)lang);
280 LOGW("language get error");
283 return ug_send_event(UG_EVENT_LANG_CHANGE);
286 static int region_changed(void *data)
288 return ug_send_event(UG_EVENT_REGION_CHANGE);
291 static void _home_screen_top_cb(keynode_t* node, void *data)
293 struct appdata *ad = data;
296 LOGE("home screen top cb node value is null");
300 if ((vconf_keynode_get_int(node) == VCONFKEY_IDLE_SCREEN_TOP_TRUE) && (!ad->is_transient)) {
301 LOGW("home key pressed. window is not transient. ug client will be terminated");
306 static int app_create(void *data)
308 struct appdata *ad = data;
311 Evas_Object *conform;
315 win = create_win(PACKAGE);
320 UG_INIT_EFL(ad->win, UG_OPT_INDICATOR_ENABLE);
322 bg = elm_bg_add(win);
323 evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
324 elm_win_resize_object_add(win, bg);
325 evas_object_show(bg);
327 conform = elm_conformant_add(win);
328 evas_object_size_hint_weight_set(conform, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
329 ad->conform = conform;
332 ly = _ug_client_load_edj(conform, EDJ_FILE, GRP_MAIN);
335 elm_win_resize_object_add(win, conform);
337 evas_object_show(conform);
338 elm_object_content_set(conform, ly);
339 edje_object_signal_callback_add(elm_layout_edje_get(ly),
340 "EXIT", "*", main_quit_cb, NULL);
346 angle = elm_win_rotation_get((const Evas_Object *)win);
347 LOGE("rotate : %d", angle);
349 ug_send_rotate_event(angle);
352 LOGE("elm win rotation get error");
355 if(elm_win_wm_rotation_supported_get(win)) {
356 int rots[4] = { 0, 90, 180, 270 };
357 elm_win_wm_rotation_available_rotations_set(win, (const int*)&rots, 4);
359 LOGW("wm rotation supported get error");
362 evas_object_smart_callback_add(win, "wm,rotation,changed", rotate, data);
364 appcore_set_event_callback(APPCORE_EVENT_LOW_MEMORY, low_memory, ad);
365 appcore_set_event_callback(APPCORE_EVENT_LOW_BATTERY, low_battery, ad);
366 appcore_set_event_callback(APPCORE_EVENT_LANG_CHANGE, lang_changed, ad);
367 appcore_set_event_callback(APPCORE_EVENT_REGION_CHANGE, region_changed, ad);
372 static int app_terminate(void *data)
374 struct appdata *ad = data;
376 LOGD("app_terminate called");
378 evas_object_smart_callback_del(ad->win, "wm,rotation,changed", rotate);
383 evas_object_del(ad->ly_main);
388 evas_object_del(ad->win);
392 service_destroy(ad->request);
398 LOGD("app_terminate end");
403 static int app_pause(void *data)
405 struct appdata *ad = data;
407 LOGD("app_pause called");
411 #if ENABLE_TRANSIENT_SUB_MODE
412 if (!ad->is_transient) {
413 LOGD("app_pause received. close ug service");
421 static int app_resume(void *data)
427 static int svc_cb(void *data)
429 LOGD("svc_cb called");
433 static int app_reset(bundle *b, void *data)
435 struct appdata *ad = data;
436 struct ug_cbs cbs = { 0, };
438 enum ug_mode mode = UG_MODE_FULLVIEW;
440 Ecore_X_Window id2 = elm_win_xwindow_get(ad->win);
442 ret = appsvc_request_transient_app(b, id2, svc_cb, "svc test");
445 LOGD("fail to request transient app: return value(%d)", ret);
446 if(vconf_notify_key_changed(VCONFKEY_IDLE_SCREEN_TOP, _home_screen_top_cb, ad) != 0) {
447 LOGW("home screen vconf key changed cb error");
450 /* check home screen raise */
451 ad->is_transient = 1;
455 elm_win_activate(ad->win);
456 evas_object_show(ad->win);
459 if (ad->data) /* ug-launcher */
460 service_create_event(ad->data, &service);
462 service_create_event(b, &service);
465 service_clone(&ad->request, service);
466 service_destroy(service);
469 cbs.layout_cb = _ug_client_layout_cb;
470 cbs.destroy_cb = _ug_client_destroy_cb;
471 cbs.result_cb = _ug_client_result_cb;
472 cbs.end_cb = _ug_client_end_cb;
475 mode = ad->is_frameview ? UG_MODE_FRAMEVIEW : UG_MODE_FULLVIEW;
477 ad->ug = ug_create(NULL, ad->name, mode, ad->request, &cbs);
478 if (ad->ug == NULL) {
479 LOGE("ug_create fail: %s", ad->name);
486 static int update_argument(const char *optarg, struct appdata *ad)
490 key = strtok((char *)optarg, ",");
494 val = optarg + strlen(key) + 1;
497 ad->data = bundle_create();
500 bundle_add(ad->data, key, val);
504 int main(int argc, char *argv[])
508 struct appcore_ops ops = {
509 .create = app_create,
510 .terminate = app_terminate,
512 .resume = app_resume,
517 memset(&ad, 0x0, sizeof(struct appdata));
520 cmdlen = strlen(argv[0]);
521 if (strncmp(argv[0], "ug-launcher", cmdlen) == 0
522 || strncmp(argv[0], PATH_UG_LAUNCHER , cmdlen) == 0) {
523 while ((opt = getopt(argc, argv, "n:d:")) != -1) {
527 ad.name = strdup(optarg);
536 if (update_argument(optarg, &ad)) {
538 bundle_free(ad.data);
553 argc = 1; // remove appsvc bundle
554 } else { /* ug-client */
556 name = strrchr(argv[0], '/');
560 ad.name = strdup(&name[1]);
562 return appcore_efl_main(PACKAGE, &argc, &argv, &ops);