Set locale based on LANG and LC_ALL environment variables set
[profile/ivi/lemolo.git] / dialer / gui.c
index 9f78262..b181804 100644 (file)
@@ -8,6 +8,18 @@
 #include "keypad.h"
 #include "history.h"
 #include "callscreen.h"
+#include "ussd.h"
+#include "util.h"
+#include "simple-popup.h"
+#include "i18n.h"
+
+#ifdef HAVE_TIZEN
+#include <appcore-efl.h>
+#ifdef HAVE_UI_GADGET
+#include <ui-gadget.h>
+#endif
+#include <Ecore_X.h>
+#endif
 
 static Evas_Object *win = NULL;
 static Evas_Object *main_layout = NULL;
@@ -16,322 +28,97 @@ static Evas_Object *contacts = NULL;
 static Evas_Object *history = NULL;
 static Evas_Object *cs = NULL;
 static Evas_Object *flip = NULL;
-static char def_theme[PATH_MAX] = "";
+static Evas_Object *current_view = NULL;
 
 static OFono_Callback_List_Modem_Node *callback_node_modem_changed = NULL;
+static OFono_Callback_List_USSD_Notify_Node *callback_node_ussd_notify = NULL;
+static AMB_Callback_List_Node *callback_node_amb_properties_changed = NULL;
+static Locale_Callback_List_Node *callback_node_locale_properties_changed = NULL;
 
 /* XXX elm_flip should just do the right thing, but it does not */
 static Eina_Bool in_call = EINA_FALSE;
 static Eina_Bool in_flip_anim = EINA_FALSE;
 
+static Eina_Bool night_mode = EINA_FALSE;
+
 Contact_Info *gui_contact_search(const char *number, const char **type)
 {
        return contact_search(contacts, number, type);
 }
 
-Evas_Object *gui_layout_add(Evas_Object *parent, const char *style)
-{
-       Evas_Object *layout = elm_layout_add(parent);
-       if (!elm_layout_theme_set(layout, "layout", "dialer", style)) {
-               CRITICAL("No theme for 'elm/layout/dialer/%s' at %s",
-                               style, def_theme);
-               evas_object_del(layout);
-               return NULL;
-       }
-       return layout;
-}
-
-static void _gui_show(Evas_Object *o)
-{
-       if (o == keypad)
-               elm_object_signal_emit(main_layout, "show,keypad", "gui");
-       else if (o == contacts)
-               elm_object_signal_emit(main_layout, "show,contacts", "gui");
-       else if (o == history)
-               elm_object_signal_emit(main_layout, "show,history", "gui");
-       elm_object_focus_set(o, EINA_TRUE);
-}
-
-typedef struct _Simple_Popup
-{
-       Evas_Object *popup;
-       Evas_Object *box;
-       Evas_Object *message;
-       Evas_Object *entry;
-       Ecore_Timer *recalc_timer; /* HACK */
-} Simple_Popup;
-
-static void _popup_close(void *data, Evas_Object *bt __UNUSED__, void *event __UNUSED__)
-{
-       Evas_Object *popup = data;
-       evas_object_del(popup);
-}
-
-void gui_simple_popup_title_set(Evas_Object *p, const char *title)
-{
-       if (title) {
-               elm_object_part_text_set(p, "elm.text.title", title);
-               elm_object_signal_emit(p, "show,title", "gui");
-       } else {
-               elm_object_part_text_set(p, "elm.text.title", "");
-               elm_object_signal_emit(p, "hide,title", "gui");
-       }
-}
-
-/* HACK: force recalc from an idler to fix elm_entry problem */
-static Eina_Bool _gui_simple_popup_entries_reeval(void *data)
-{
-       Simple_Popup *ctx = data;
-       if (ctx->message)
-               elm_entry_calc_force(ctx->message);
-       if (ctx->entry)
-               elm_entry_calc_force(ctx->entry);
-       ctx->recalc_timer = NULL;
-       return EINA_FALSE;
-}
-
-static void _gui_simple_popup_timer_cancel_if_needed(Simple_Popup *ctx)
-{
-       if (!ctx->recalc_timer)
-               return;
-       if (ctx->message || ctx->entry)
-               return;
-       ecore_timer_del(ctx->recalc_timer);
-       ctx->recalc_timer = NULL;
-}
-
-static void _gui_simple_popup_message_del(void *data, Evas *e __UNUSED__,
-                                               Evas_Object *en __UNUSED__,
-                                               void *einfo __UNUSED__)
-{
-       Simple_Popup *ctx = data;
-       ctx->message = NULL;
-       _gui_simple_popup_timer_cancel_if_needed(ctx);
-}
-
-static void _gui_simple_popup_entry_del(void *data, Evas *e __UNUSED__,
-                                       Evas_Object *en __UNUSED__,
-                                       void *einfo __UNUSED__)
-{
-       Simple_Popup *ctx = data;
-       ctx->entry = NULL;
-       _gui_simple_popup_timer_cancel_if_needed(ctx);
-}
-
-static void _gui_simple_popup_reeval_content(Simple_Popup *ctx)
-{
-       if ((!ctx->message) && (!ctx->entry)) {
-               elm_object_part_content_unset(ctx->popup,
-                                               "elm.swallow.content");
-               elm_object_signal_emit(ctx->popup, "hide,content", "gui");
-               evas_object_hide(ctx->box);
-               return;
-       }
-
-       elm_box_unpack_all(ctx->box);
-       if (ctx->message) {
-               elm_box_pack_end(ctx->box, ctx->message);
-               evas_object_show(ctx->message);
-       }
-       if (ctx->entry) {
-               elm_box_pack_end(ctx->box, ctx->entry);
-               evas_object_show(ctx->entry);
-       }
-
-       elm_object_part_content_set(ctx->popup, "elm.swallow.content",
-                                       ctx->box);
-       elm_object_signal_emit(ctx->popup, "show,content", "gui");
-
-       /* HACK: elm_entry is not evaluating properly and the text is
-        * not centered as it should be. Then we must force a
-        * calculation from an timer.
-        */
-       if (ctx->recalc_timer)
-               ecore_timer_del(ctx->recalc_timer);
-       ctx->recalc_timer = ecore_timer_add(
-               0.02, _gui_simple_popup_entries_reeval, ctx);
-}
-
-void gui_simple_popup_message_set(Evas_Object *p, const char *msg)
+static void _dial_reply(void *data, OFono_Error err,
+                       OFono_Call *call __UNUSED__)
 {
-       Simple_Popup *ctx = evas_object_data_get(p, "simple_popup");
-       Evas_Object *en;
-
-       EINA_SAFETY_ON_NULL_RETURN(ctx);
+       char *number = data;
 
-       if (!msg) {
-               if (ctx->message)
-                       evas_object_del(ctx->message);
-               _gui_simple_popup_reeval_content(ctx);
-               return;
-       }
-
-       if (ctx->message)
-               en = ctx->message;
-       else {
-               en = ctx->message = elm_entry_add(p);
-               elm_object_style_set(en, "dialer-popup");
-               elm_entry_editable_set(en, EINA_FALSE);
-               elm_entry_scrollable_set(en, EINA_TRUE);
-               elm_entry_scrollbar_policy_set(en, ELM_SCROLLER_POLICY_OFF,
-                                               ELM_SCROLLER_POLICY_AUTO);
-
-               evas_object_event_callback_add(en, EVAS_CALLBACK_DEL,
-                                       _gui_simple_popup_message_del,
-                                       ctx);
-               evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND,
-                                                       EVAS_HINT_EXPAND);
-               evas_object_size_hint_align_set(en, EVAS_HINT_FILL,
-                                               EVAS_HINT_FILL);
+       if (err != OFONO_ERROR_NONE) {
+               char buf[1024];
+               const char *msg = ofono_error_message_get(err);
+               snprintf(buf, sizeof(buf), _("Could not call %s: %s"),
+                               number, msg);
+               gui_simple_popup(_("Error"), buf);
        }
 
-       elm_object_text_set(en, msg);
-       _gui_simple_popup_reeval_content(ctx);
-}
-
-void gui_simple_popup_entry_enable(Evas_Object *p)
-{
-       Simple_Popup *ctx = evas_object_data_get(p, "simple_popup");
-       Evas_Object *en;
-
-       EINA_SAFETY_ON_NULL_RETURN(ctx);
-
-       if (ctx->entry)
-               return;
-       en = ctx->entry = elm_entry_add(p);
-       elm_object_style_set(en, "dialer-popup-editable");
-       elm_entry_editable_set(en, EINA_TRUE);
-       elm_entry_scrollable_set(en, EINA_TRUE);
-       elm_entry_scrollbar_policy_set(en, ELM_SCROLLER_POLICY_OFF,
-                                       ELM_SCROLLER_POLICY_AUTO);
-
-       evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND,
-                                               EVAS_HINT_EXPAND);
-       evas_object_size_hint_align_set(en, EVAS_HINT_FILL,
-                                       EVAS_HINT_FILL);
-
-       evas_object_event_callback_add(en, EVAS_CALLBACK_DEL,
-                                       _gui_simple_popup_entry_del,
-                                       ctx);
-       _gui_simple_popup_reeval_content(ctx);
-}
-
-void gui_simple_popup_entry_disable(Evas_Object *p)
-{
-       Simple_Popup *ctx = evas_object_data_get(p, "simple_popup");
-       EINA_SAFETY_ON_NULL_RETURN(ctx);
-       if (!ctx->entry)
-               return;
-       evas_object_del(ctx->entry);
-       _gui_simple_popup_reeval_content(ctx);
+       free(number);
 }
 
-const char *gui_simple_popup_entry_get(const Evas_Object *p)
+OFono_Pending *gui_dial(const char *number)
 {
-       Simple_Popup *ctx = evas_object_data_get(p, "simple_popup");
-       EINA_SAFETY_ON_NULL_RETURN_VAL(ctx, NULL);
-       EINA_SAFETY_ON_NULL_RETURN_VAL(ctx->entry, NULL);
-       return elm_object_text_get(ctx->entry);
+       char *copy = strdup(number);
+       return ofono_dial(copy, NULL, _dial_reply, copy);
 }
 
-void gui_simple_popup_button_dismiss_set(Evas_Object *p)
-{
-       gui_simple_popup_buttons_set(p,
-                                       "Dismiss",
-                                       "dialer",
-                                       _popup_close,
-                                       NULL, NULL, NULL,
-                                       p);
+static void _gui_set_text(void)
+{
+       elm_object_part_text_set(cs, "label.hide-keypad", _("Hide Keypad"));
+       elm_object_part_text_set(cs, "label.answer", _("Answer"));
+       elm_object_part_text_set(cs, "label.hangup", _("Hangup"));
+       elm_object_part_text_set(cs, "label.multiparty", _("Conference"));
+       elm_object_part_text_set(cs, "label.multiparty-details-back", _("Back"));
+       elm_object_part_text_set(cs, "label.waiting", _("Waiting..."));
+       elm_object_part_text_set(cs, "elm.text.name", _("Unknown"));
+       elm_object_part_text_set(cs, "elm.text.waiting", _("Unknown"));
+
+       elm_object_part_text_set(keypad, "label.all", _("Decline"));
+       elm_object_part_text_set(keypad, "label.missed", _("Hold + Answer"));
+       elm_object_part_text_set(keypad, "label.clear", _("Hangup + Answer"));
+       elm_object_part_text_set(keypad, "label.edit,done", _("Redial"));
+
+       elm_object_part_text_set(history, "label.all", _("All"));
+       elm_object_part_text_set(history, "label.missed", _("Missed"));
+       elm_object_part_text_set(history, "label.clear", _("Clear"));
+       elm_object_part_text_set(history, "label.edit,done", _("Done"));
 }
 
-void gui_simple_popup_buttons_set(Evas_Object *p,
-                                       const char *b1_label,
-                                       const char *b1_class,
-                                       Evas_Smart_Cb b1_cb,
-                                       const char *b2_label,
-                                       const char *b2_class,
-                                       Evas_Smart_Cb b2_cb,
-                                       const void *data)
+static void _gui_show(Evas_Object *o)
 {
-       Evas_Object *bt;
-       unsigned int count = 0;
-
-       if (b1_label) {
-               bt = elm_button_add(p);
-               elm_object_style_set(bt, b1_class ? b1_class : "dialer");
-               elm_object_text_set(bt, b1_label);
-               elm_object_part_content_set(p, "elm.swallow.button1", bt);
-               evas_object_smart_callback_add(bt, "clicked", b1_cb, data);
-               count++;
-       }
+       Last_User_Mode *last;
 
-       if (b2_label) {
-               const char *part;
-               bt = elm_button_add(p);
-               elm_object_style_set(bt, b2_class ? b2_class : "dialer");
-               elm_object_text_set(bt, b2_label);
-
-               if (count == 1)
-                       part = "elm.swallow.button2";
-               else
-                       part = "elm.swallow.button1";
+       last = util_get_last_user_mode();
+       if (o == keypad)
+               elm_object_signal_emit(main_layout, "show,keypad", "gui");
+       else if (o == contacts)
+               elm_object_signal_emit(main_layout, "show,contacts", "gui");
+       else if (o == history)
+               elm_object_signal_emit(main_layout, "show,history", "gui");
+       elm_object_focus_set(o, EINA_TRUE);
+       current_view = o;
 
-               elm_object_part_content_set(p, part, bt);
-               evas_object_smart_callback_add(bt, "clicked", b2_cb, data);
-               count++;
-       }
+       if (last) {
+               if (current_view == keypad)
+                       last->last_view = DIALER_LAST_VIEW_KEYPAD;
+               else if (current_view == contacts)
+                       last->last_view = DIALER_LAST_VIEW_CONTACTS;
+               else if (current_view == history)
+                       last->last_view = DIALER_LAST_VIEW_HISTORY;
 
-       if (count == 2)
-               elm_object_signal_emit(p, "buttons,2", "gui");
-       else if (count == 1) {
-               elm_object_signal_emit(p, "buttons,1", "gui");
-               elm_object_part_content_set(p, "elm.swallow.button2", NULL);
-       } else {
-               elm_object_signal_emit(p, "buttons,0", "gui");
-               elm_object_part_content_set(p, "elm.swallow.button1", NULL);
-               elm_object_part_content_set(p, "elm.swallow.button2", NULL);
+               util_set_last_user_mode(last);
        }
 }
 
-static void _gui_simple_popup_del(void *data, Evas *e __UNUSED__,
-                                       Evas_Object *o __UNUSED__,
-                                       void *event_info __UNUSED__)
-{
-       Simple_Popup *ctx = data;
-       free(ctx);
-}
-
 Evas_Object *gui_simple_popup(const char *title, const char *message)
 {
-       Evas_Object *p = gui_layout_add(win, "popup");
-       Simple_Popup *ctx;
-
-       EINA_SAFETY_ON_NULL_RETURN_VAL(p, NULL);
-
-       ctx = calloc(1, sizeof(Simple_Popup));
-       EINA_SAFETY_ON_NULL_GOTO(ctx, failed_calloc);
-
-       evas_object_data_set(p, "simple_popup", ctx);
-       ctx->popup = p;
-       evas_object_event_callback_add(p, EVAS_CALLBACK_DEL,
-                                       _gui_simple_popup_del, ctx);
-
-       evas_object_size_hint_weight_set(p, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
-       elm_win_resize_object_add(win, p);
-
-       ctx->box = elm_box_add(p);
-
-       gui_simple_popup_title_set(p, title);
-       gui_simple_popup_message_set(p, message);
-       gui_simple_popup_button_dismiss_set(p);
-
-       evas_object_show(p);
-
-       return p;
-
-failed_calloc:
-       evas_object_del(p);
-       return NULL;
+       return simple_popup_add(win, title, message);
 }
 
 void gui_activate(void)
@@ -339,6 +126,11 @@ void gui_activate(void)
        elm_win_raise(win);
        elm_win_activate(win);
        evas_object_show(win);
+
+       /* Automatically enable hfp modem if app is in the foreground */
+       if (!ofono_voice_is_online()) {
+               ofono_powered_set(EINA_TRUE, NULL, NULL);
+       }
 }
 
 void gui_number_set(const char *number, Eina_Bool auto_dial)
@@ -405,25 +197,24 @@ static void _gui_call_sync(void *data __UNUSED__, Evas_Object *o __UNUSED__,
        in_flip_anim = EINA_FALSE;
 }
 
-static void _dial_reply(void *data, OFono_Error err,
-                       OFono_Call *call __UNUSED__)
-{
-       const char *number = data;
-
-       if (err != OFONO_ERROR_NONE) {
-               char buf[1024];
-               snprintf(buf, sizeof(buf), "Could not call: %s", number);
-               gui_simple_popup("Error", buf);
-       }
-}
-
 static void _gui_voicemail(void)
 {
        const char *number = ofono_voicemail_number_get();
        EINA_SAFETY_ON_NULL_RETURN(number);
        EINA_SAFETY_ON_FALSE_RETURN(*number != '\0');
 
-       ofono_dial(number, NULL, _dial_reply, number);
+       gui_dial(number);
+}
+
+static void _gui_quit(void)
+{
+       elm_exit();
+}
+
+static void _on_del(void *data __UNUSED__, Evas *e __UNUSED__,
+                        Evas_Object *obj __UNUSED__, void *event __UNUSED__)
+{
+       _gui_quit();
 }
 
 static void _on_clicked(void *data __UNUSED__, Evas_Object *o __UNUSED__,
@@ -442,6 +233,8 @@ static void _on_clicked(void *data __UNUSED__, Evas_Object *o __UNUSED__,
                _gui_show(history);
        else if (strcmp(emission, "voicemail") == 0)
                _gui_voicemail();
+       else if (strcmp(emission, "quit") == 0)
+               _gui_quit();
 }
 
 static void _ofono_changed(void *data __UNUSED__)
@@ -487,42 +280,110 @@ static void _ofono_changed(void *data __UNUSED__)
        elm_object_part_text_set(main_layout, "elm.text.voicemail", buf);
 }
 
-Eina_Bool gui_init(const char *theme)
+static void _amb_properties_changed(void *data __UNUSED__)
+{
+       Eina_Bool night_mode_changed = amb_night_mode_get();
+       if (night_mode != night_mode_changed) {
+               DBG("Night mode changed to %d", night_mode_changed);
+               night_mode = night_mode_changed;
+               util_set_night_mode(night_mode);
+
+               if (current_view)
+                       _gui_show(current_view);
+       }
+}
+
+static void _locale_properties_changed(void *data __UNUSED__)
+{
+       const char *new_lang = locale_lang_get();
+       if (new_lang) {
+               if (strncmp(new_lang, "LANG=", 5) == 0)
+                       new_lang += 5;
+
+               DBG("Switching UI language to %s", new_lang);
+               setenv ("LANG", new_lang, 1);
+               setlocale (LC_ALL, new_lang);
+               _gui_set_text();
+       }
+}
+
+static void _ofono_ussd_notify(void *data __UNUSED__, Eina_Bool needs_reply,
+                               const char *message)
+{
+       DBG("needs_reply=%d, message=%s", needs_reply, message);
+       ussd_start(message);
+}
+
+static void _on_contacts_selected(void *data __UNUSED__,
+                                       Evas_Object *obj __UNUSED__,
+                                       void *event_info)
+{
+       const char *number = event_info;
+       DBG("Contact selected: %s", number);
+       gui_dial(number);
+}
+
+static void _load_last_user_view() {
+       Last_User_Mode *last;
+
+       last = util_get_last_user_mode();
+       if (!last) {
+               DBG("Last user config file not found - create default view");
+               last = calloc(1, sizeof(Last_User_Mode));
+               last->last_view = DIALER_LAST_VIEW_KEYPAD;
+               last->last_history_view = DIALER_LAST_HISTORY_VIEW_ALL;
+               last->last_number = eina_stringshare_add("");
+               util_set_last_user_mode(last);
+       }
+
+       if(last->last_number) {
+               keypad_number_set(keypad, last->last_number, EINA_FALSE);
+       }
+       if (last->last_view == DIALER_LAST_VIEW_KEYPAD) {
+               _gui_show(keypad);
+       } else if (last->last_view == DIALER_LAST_VIEW_CONTACTS) {
+               _gui_show(contacts);
+       } else if (last->last_view == DIALER_LAST_VIEW_HISTORY) {
+               _gui_show(history);
+               if (last->last_history_view != DIALER_LAST_HISTORY_VIEW_ALL) {
+                       elm_object_signal_emit(history, "show,missed", "gui");
+               }
+       }
+       eina_stringshare_del(last->last_number);
+       free(last);
+}
+
+Eina_Bool gui_init(void)
 {
        Evas_Object *lay, *obj;
        Evas_Coord w, h;
+       const char *lang;
 
        /* dialer should never, ever quit */
-       elm_policy_set(ELM_POLICY_QUIT, ELM_POLICY_QUIT_NONE);
-
-       elm_app_compile_bin_dir_set(PACKAGE_BIN_DIR);
-       elm_app_compile_data_dir_set(PACKAGE_DATA_DIR);
-       elm_app_info_set(gui_init, "ofono-efl", "themes/default.edj");
-
-       snprintf(def_theme, sizeof(def_theme), "%s/themes/default.edj",
-                       elm_app_data_dir_get());
-
-       elm_theme_extension_add(NULL, def_theme);
-       if (!theme)
-               elm_theme_overlay_add(NULL, def_theme);
-       else {
-               char tmp[PATH_MAX];
-               if (theme[0] != '/') {
-                       if (eina_str_has_suffix(theme, ".edj")) {
-                               snprintf(tmp, sizeof(tmp), "%s/themes/%s",
-                                               elm_app_data_dir_get(), theme);
-                       } else {
-                               snprintf(tmp, sizeof(tmp), "%s/themes/%s.edj",
-                                               elm_app_data_dir_get(), theme);
-                       }
-                       theme = tmp;
-               }
-               elm_theme_overlay_add(NULL, theme);
-       }
+       elm_policy_set(ELM_POLICY_QUIT, ELM_POLICY_QUIT_LAST_WINDOW_CLOSED);
 
        win = elm_win_util_standard_add("ofono-dialer", "oFono Dialer");
        EINA_SAFETY_ON_NULL_RETURN_VAL(win, EINA_FALSE);
-       elm_win_autodel_set(win, EINA_FALSE);
+       elm_win_autodel_set(win, EINA_TRUE);
+       evas_object_event_callback_add(win, EVAS_CALLBACK_DEL, _on_del, NULL);
+
+#ifdef HAVE_TIZEN
+#ifdef HAVE_UI_GADGET
+       UG_INIT_EFL(win, UG_OPT_INDICATOR_PORTRAIT_ONLY);
+#endif
+#endif
+
+       /*
+        * check LANG and LC_ALL environment variables,
+        * LC_ALL takes precedence
+        */
+       lang = getenv("LC_ALL");
+       if (!lang)
+               lang = getenv("LANG");
+
+       setlocale(LC_ALL, lang);
+       bindtextdomain(PACKAGE, LOCALEDIR);
+       textdomain(PACKAGE);
 
        flip = elm_flip_add(win);
        evas_object_size_hint_weight_set(flip,
@@ -533,7 +394,7 @@ Eina_Bool gui_init(const char *theme)
                                        _gui_call_sync, NULL);
        evas_object_show(flip);
 
-       main_layout = lay = gui_layout_add(win, "main");
+       main_layout = lay = layout_add(win, "dialer");
        EINA_SAFETY_ON_NULL_RETURN_VAL(lay, EINA_FALSE);
        evas_object_size_hint_weight_set(lay,
                                EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
@@ -549,6 +410,8 @@ Eina_Bool gui_init(const char *theme)
        elm_object_part_content_set(lay, "elm.swallow.keypad", obj);
 
        contacts = obj = contacts_add(win);
+       evas_object_smart_callback_add(contacts, "selected",
+                                       _on_contacts_selected, NULL);
        EINA_SAFETY_ON_NULL_RETURN_VAL(obj, EINA_FALSE);
        elm_object_part_content_set(lay, "elm.swallow.contacts", obj);
 
@@ -556,8 +419,6 @@ Eina_Bool gui_init(const char *theme)
        EINA_SAFETY_ON_NULL_RETURN_VAL(obj, EINA_FALSE);
        elm_object_part_content_set(lay, "elm.swallow.history", obj);
 
-       _gui_show(keypad);
-
        cs = obj = callscreen_add(win);
        EINA_SAFETY_ON_NULL_RETURN_VAL(obj, EINA_FALSE);
        evas_object_size_hint_weight_set(obj,
@@ -566,8 +427,17 @@ Eina_Bool gui_init(const char *theme)
        elm_object_part_content_set(flip, "back", obj);
        evas_object_show(obj);
 
+       _gui_set_text();
+       _load_last_user_view();
+
        callback_node_modem_changed =
                ofono_modem_changed_cb_add(_ofono_changed, NULL);
+       callback_node_ussd_notify =
+               ofono_ussd_notify_cb_add(_ofono_ussd_notify, NULL);
+       callback_node_amb_properties_changed =
+               amb_properties_changed_cb_add(_amb_properties_changed, NULL);
+       callback_node_locale_properties_changed =
+               locale_properties_changed_cb_add(_locale_properties_changed, NULL);
 
        /* TODO: make it match better with Tizen: icon and other properties */
        obj = elm_layout_edje_get(lay);