modules/network: Two SIM handled. 34/66134/7 submit/tizen/20160427.101032 submit/tizen/20160509.093301
authorRadoslaw Czerski <r.czerski@samsung.com>
Tue, 26 Apr 2016 09:17:10 +0000 (11:17 +0200)
committerLukasz Stanislawski <l.stanislaws@samsung.com>
Wed, 27 Apr 2016 09:35:40 +0000 (02:35 -0700)
Change-Id: I52610dfa2a2e89e2929f36c1515b3169df8bc108
Signed-off-by: Radoslaw Czerski <r.czerski@samsung.com>
src/modules/modules.c
src/modules/network/rssi.c

index 8cdc93c84f2754909181617933d856f2df6f1f9d..c5cfcd737e2540a9840a5a84d2756ab18c03fed7 100644 (file)
@@ -28,8 +28,7 @@
 extern icon_s search;
 #endif
 /* Network */
-extern icon_s rssi;
-
+extern icon_s rssi[];
 /* Connection */
 extern icon_s usb;
 extern icon_s wifi;
@@ -89,7 +88,8 @@ static icon_s *modules[INDICATOR_MODULE_NUMBERS] = {
        &battery,
        /* Network */
        &wifi,
-       &rssi,
+       &rssi[0],
+       &rssi[1],
        /* Connection */
        &usb,
        &mobile_hotspot,
@@ -145,7 +145,7 @@ void modules_init_first(void *data)
 {
        int i;
        /* add items to list */
-       for (i = 0; i < 5; i++) {
+       for (i = 0; i < 6; i++) {
                list_insert_icon(modules[i]);
                modules[i]->ad = data;
                if (modules[i]->init && !modules[i]->initialized) {
index f17128ef6374bf65cbf89f4fdaa9f4eae0fa4ed4..f2b57ca8d91b67a5f0eed9fbd8184cea88480a80 100644 (file)
@@ -41,6 +41,7 @@
 #define ICON_SEARCH            _("IDS_COM_BODY_SEARCHING")
 #define ICON_NOSVC             _("IDS_CALL_POP_NOSERVICE")
 
+static void _hide_image_icon(int sim_no);
 static int register_rssi_module(void *data);
 static int unregister_rssi_module(void);
 static int language_changed_cb(void *data);
@@ -53,7 +54,7 @@ static char *access_info_cb(void *data, Evas_Object *obj);
 
 static telephony_handle_list_s tel_list;
 
-icon_s rssi = {
+icon_s rssi[2] = {{
        .type = INDICATOR_IMG_ICON,
        .name = MODULE_NAME,
        .priority = RSSI1_ICON_PRIORITY,
@@ -70,7 +71,25 @@ icon_s rssi = {
        .tts_enable = EINA_TRUE,
        .access_cb = access_info_cb
 #endif
-};
+},
+{
+       .type = INDICATOR_IMG_ICON,
+       .name = MODULE_NAME,
+       .priority = RSSI2_ICON_PRIORITY,
+       .always_top = EINA_FALSE,
+       .exist_in_view = EINA_FALSE,
+       .img_obj = {0,},
+       .obj_exist = EINA_FALSE,
+       .area = INDICATOR_ICON_AREA_FIXED,
+       .init = register_rssi_module,
+       .fini = unregister_rssi_module,
+       .lang_changed = language_changed_cb,
+       .wake_up = wake_up_cb,
+#ifdef _SUPPORT_SCREEN_READER
+       .tts_enable = EINA_TRUE,
+       .access_cb = access_info_cb
+#endif
+}};
 
 typedef enum {
        LEVEL_RSSI_MIN = 0,
@@ -79,11 +98,11 @@ typedef enum {
        LEVEL_SEARCH,
        LEVEL_NOSVC,
        LEVEL_LIMITED,
-       LEVEL_RSSI_SIM1_0,
-       LEVEL_RSSI_SIM1_1,
-       LEVEL_RSSI_SIM1_2,
-       LEVEL_RSSI_SIM1_3,
-       LEVEL_RSSI_SIM1_4,
+       LEVEL_RSSI_SIM_0,
+       LEVEL_RSSI_SIM_1,
+       LEVEL_RSSI_SIM_2,
+       LEVEL_RSSI_SIM_3,
+       LEVEL_RSSI_SIM_4,
        LEVEL_RSSI_ROAMING_0,
        LEVEL_RSSI_ROAMING_1,
        LEVEL_RSSI_ROAMING_2,
@@ -92,7 +111,19 @@ typedef enum {
        LEVEL_MAX
 } rssi_icon_e;
 
-static int updated_while_lcd_off = 0;
+static int updated_while_lcd_off;
+static int sim_in_service;
+static int sim_inserted;
+
+enum {
+       SIM_1_IN_SERVICE = 1,
+       SIM_2_IN_SERVICE = 2
+};
+
+enum {
+       SIM_1 = 0,
+       SIM_2 = 1
+};
 
 static const char *icon_path[LEVEL_MAX] = {
        [LEVEL_FLIGHT] = "RSSI/B03_RSSI_Flightmode.png",
@@ -100,11 +131,11 @@ static const char *icon_path[LEVEL_MAX] = {
        [LEVEL_SEARCH] = "RSSI/B03_RSSI_Searching.png",
        [LEVEL_NOSVC] = "RSSI/B03_RSSI_NoService.png",
        [LEVEL_LIMITED] = "RSSI/B03_Network_LimitedService.png",
-       [LEVEL_RSSI_SIM1_0] = "RSSI/B03_RSSI_Sim_00.png",
-       [LEVEL_RSSI_SIM1_1] = "RSSI/B03_RSSI_Sim_01.png",
-       [LEVEL_RSSI_SIM1_2] = "RSSI/B03_RSSI_Sim_02.png",
-       [LEVEL_RSSI_SIM1_3] = "RSSI/B03_RSSI_Sim_03.png",
-       [LEVEL_RSSI_SIM1_4] = "RSSI/B03_RSSI_Sim_04.png",
+       [LEVEL_RSSI_SIM_0] = "RSSI/B03_RSSI_Sim_00.png",
+       [LEVEL_RSSI_SIM_1] = "RSSI/B03_RSSI_Sim_01.png",
+       [LEVEL_RSSI_SIM_2] = "RSSI/B03_RSSI_Sim_02.png",
+       [LEVEL_RSSI_SIM_3] = "RSSI/B03_RSSI_Sim_03.png",
+       [LEVEL_RSSI_SIM_4] = "RSSI/B03_RSSI_Sim_04.png",
        [LEVEL_RSSI_ROAMING_0] = "RSSI/B03_RSSI_roaming_00.png",
        [LEVEL_RSSI_ROAMING_1] = "RSSI/B03_RSSI_roaming_01.png",
        [LEVEL_RSSI_ROAMING_2] = "RSSI/B03_RSSI_roaming_02.png",
@@ -112,25 +143,74 @@ static const char *icon_path[LEVEL_MAX] = {
        [LEVEL_RSSI_ROAMING_4] = "RSSI/B03_RSSI_roaming_04.png",
 };
 
-static void set_app_state(voiddata)
+static void set_app_state(void *data)
 {
-       rssi.ad = data;
+       rssi[SIM_1].ad = data;
+       rssi[SIM_2].ad = data;
 }
 
-static void _show_image_icon(void *data, int index)
+static int get_second_sim_no(int current_sim_no)
+{
+       return (current_sim_no == SIM_1) ? SIM_2 : SIM_1;
+}
+
+static bool second_sim_is_inserted(int current_sim_no) {
+
+       int second_sim_no = get_second_sim_no(current_sim_no);
+
+       if(!(sim_inserted & (1 << second_sim_no))) {
+               _D("Strings are equal");
+               return false;
+       }
+       return true;
+}
+
+static void image_show(int sim_no, int index)
+{
+       rssi[sim_no].img_obj.width = DEFAULT_ICON_WIDTH;
+       rssi[sim_no].img_obj.data = icon_path[index];
+       icon_show(&rssi[sim_no]);
+       util_signal_emit(rssi[sim_no].ad, (sim_no == SIM_1) ? "indicator.rssi1.show" :
+                       "indicator.rssi2.show", "indicator.prog");
+}
+
+static void _show_image_icon(void *data, int index, int sim_no)
 {
        if (index < LEVEL_RSSI_MIN) {
                index = LEVEL_RSSI_MIN;
-       } else if (index >= LEVEL_MAX) {
+       } else if (index >= LEVEL_MAX)
                index = LEVEL_NOSVC;
+
+       if (index >= LEVEL_RSSI_SIM_0)
+               sim_in_service |= (1 << sim_no);
+       else
+               sim_in_service &= ~(1 << sim_no);
+
+       if(index != LEVEL_NOSIM)
+               sim_inserted |= (1 << sim_no);
+       else
+               sim_inserted &= ~(1 << sim_no);
+
+       if (index == LEVEL_NOSIM && (sim_in_service &
+                       ((sim_no == SIM_1) ? SIM_2_IN_SERVICE : SIM_1_IN_SERVICE))) {
+               _hide_image_icon(sim_no);
+               return;
        }
 
-       rssi.img_obj.width = DEFAULT_ICON_WIDTH;
-       rssi.img_obj.data = icon_path[index];
+       if (index == LEVEL_NOSIM && !second_sim_is_inserted(sim_no)) {
+               image_show(SIM_1, LEVEL_NOSIM);
+               _hide_image_icon(SIM_2);
+               return;
+       }
 
-       icon_show(&rssi);
+       image_show(sim_no, index);
+}
 
-       util_signal_emit(rssi.ad, "indicator.rssi1.show", "indicator.prog");
+static void _hide_image_icon(int sim_no)
+{
+       icon_hide(&rssi[sim_no]);
+       util_signal_emit(rssi[sim_no].ad, (sim_no == SIM_1) ? "indicator.rssi1.hide" :
+                       "indicator.rssi2.hide", "indicator.prog");
 }
 
 static int language_changed_cb(void *data)
@@ -174,24 +254,24 @@ static rssi_icon_e icon_enum_get(bool roaming_enabled, telephony_network_rssi_e
 {
        switch (rssi) {
                case TELEPHONY_NETWORK_RSSI_0:
-                       return roaming_enabled ? LEVEL_RSSI_ROAMING_0 : LEVEL_RSSI_SIM1_0;
+                       return roaming_enabled ? LEVEL_RSSI_ROAMING_0 : LEVEL_RSSI_SIM_0;
                case TELEPHONY_NETWORK_RSSI_1:
                case TELEPHONY_NETWORK_RSSI_2:
-                       return roaming_enabled ? LEVEL_RSSI_ROAMING_1 : LEVEL_RSSI_SIM1_1;
+                       return roaming_enabled ? LEVEL_RSSI_ROAMING_1 : LEVEL_RSSI_SIM_1;
                case TELEPHONY_NETWORK_RSSI_3:
-                       return roaming_enabled ? LEVEL_RSSI_ROAMING_2 : LEVEL_RSSI_SIM1_2;
+                       return roaming_enabled ? LEVEL_RSSI_ROAMING_2 : LEVEL_RSSI_SIM_2;
                case TELEPHONY_NETWORK_RSSI_4:
                case TELEPHONY_NETWORK_RSSI_5:
-                       return roaming_enabled ? LEVEL_RSSI_ROAMING_3 : LEVEL_RSSI_SIM1_3;
+                       return roaming_enabled ? LEVEL_RSSI_ROAMING_3 : LEVEL_RSSI_SIM_3;
                case TELEPHONY_NETWORK_RSSI_6:
-                       return roaming_enabled ? LEVEL_RSSI_ROAMING_4 : LEVEL_RSSI_SIM1_4;
+                       return roaming_enabled ? LEVEL_RSSI_ROAMING_4 : LEVEL_RSSI_SIM_4;
                default:
                        _E("Unhandled rssi level");
                        return LEVEL_RSSI_MIN;
        }
 }
 
-static void _rssi_icon_update(telephony_h handle, void *user_data)
+static void _rssi_icon_update(telephony_h handle, void *user_data, int sim_no)
 {
        telephony_network_rssi_e signal;
        bool roaming;
@@ -199,19 +279,20 @@ static void _rssi_icon_update(telephony_h handle, void *user_data)
        int ret = telephony_network_get_rssi(handle, &signal);
        retm_if(ret != TELEPHONY_ERROR_NONE, "telephony_network_get_rssi failed %s", get_error_message(ret));
 
-       _D("SIM1 signal strength level: %d", signal);
+       _D("SIM %d signal strength level: %d", sim_no + 1, signal);
 
        ret = telephony_network_get_roaming_status(handle, &roaming);
        retm_if(ret != TELEPHONY_ERROR_NONE, "telephony_network_get_roaming_status failed %s", get_error_message(ret));
 
-       _show_image_icon(user_data, icon_enum_get(roaming, signal));
+       _show_image_icon(user_data, icon_enum_get(roaming, signal), sim_no);
 }
 
 static void _view_update(void *user_data)
 {
        bool status;
        int ret = 0;
-       telephony_sim_state_e status_sim1;
+       int i;
+       telephony_sim_state_e status_sim;
 
        if (!icon_get_update_flag()) {
                updated_while_lcd_off = 1;
@@ -225,39 +306,44 @@ static void _view_update(void *user_data)
 
        if (status) {
                _D("Flight mode");
-               _show_image_icon(user_data, LEVEL_FLIGHT);
+               _show_image_icon(user_data, LEVEL_FLIGHT, SIM_1);
+               _hide_image_icon(SIM_2);
                return;
        }
+       for (i = 0; i < tel_list.count; i++){
+               ret = telephony_sim_get_state(tel_list.handle[i], &status_sim);
+               if (ret != TELEPHONY_ERROR_NONE) {
+                       _E("telephony_sim_get_state failed: %s", get_error_message(ret));
+                       continue;
+               }
 
-       ret = telephony_sim_get_state(tel_list.handle[0], &status_sim1);
-       retm_if(ret != TELEPHONY_ERROR_NONE, "telephony_sim_get_state failed: %s", get_error_message(ret));
-
-       if (status_sim1 != TELEPHONY_SIM_STATE_UNAVAILABLE) {
-               telephony_network_service_state_e service_state;
-
-               ret = telephony_network_get_service_state(tel_list.handle[0], &service_state);
-               retm_if(ret != TELEPHONY_ERROR_NONE, "telephony_network_get_service_state failed %s", get_error_message(ret));
-
-               switch (service_state) {
-               case TELEPHONY_NETWORK_SERVICE_STATE_OUT_OF_SERVICE:
-                       _D("Service type : NO_SERVICE");
-                       _show_image_icon(user_data, LEVEL_NOSVC);
-                       break;
-               case TELEPHONY_NETWORK_SERVICE_STATE_EMERGENCY_ONLY:
-                       _D("Service type : EMERGENCY");
-                       _rssi_icon_update(tel_list.handle[0], user_data);
-                       break;
-               case TELEPHONY_NETWORK_SERVICE_STATE_IN_SERVICE:
-                       _D("Service type : IN SERVICE");
-                       _rssi_icon_update(tel_list.handle[0], user_data);
-                       break;
-               default:
-                       _D("Unhandled service state %d", service_state);
-                       break;
+               if (status_sim != TELEPHONY_SIM_STATE_UNAVAILABLE) {
+                       telephony_network_service_state_e service_state;
+
+                       ret = telephony_network_get_service_state(tel_list.handle[i], &service_state);
+                       retm_if(ret != TELEPHONY_ERROR_NONE, "telephony_network_get_service_state failed %s", get_error_message(ret));
+
+                       switch (service_state) {
+                       case TELEPHONY_NETWORK_SERVICE_STATE_OUT_OF_SERVICE:
+                               _D("Service type : NO_SERVICE");
+                               _show_image_icon(user_data, LEVEL_NOSVC, i);
+                               break;
+                       case TELEPHONY_NETWORK_SERVICE_STATE_EMERGENCY_ONLY:
+                               _D("Service type : EMERGENCY");
+                               _rssi_icon_update(tel_list.handle[i], user_data, i);
+                               break;
+                       case TELEPHONY_NETWORK_SERVICE_STATE_IN_SERVICE:
+                               _D("Service type : IN SERVICE");
+                               _rssi_icon_update(tel_list.handle[i], user_data, i);
+                               break;
+                       default:
+                               _D("Unhandled service state %d", service_state);
+                               break;
+                       }
+               } else {
+                       _D("No SIM");
+                       _show_image_icon(user_data, LEVEL_NOSIM, i);
                }
-       } else {
-               _D("No SIM");
-               _show_image_icon(user_data, LEVEL_NOSIM);
        }
 }
 
@@ -313,7 +399,6 @@ static int register_rssi_module(void *data)
 {
        telephony_state_e state;
        int ret;
-
        retv_if(!data, 0);
 
        set_app_state(data);
@@ -324,11 +409,13 @@ static int register_rssi_module(void *data)
        ret = telephony_init(&tel_list);
        retvm_if(ret != TELEPHONY_ERROR_NONE, FAIL, "telephony_init failed: %s", get_error_message(ret));
 
-       ret = telephony_set_state_changed_cb(_tel_ready_cb, data);
-       if (ret != TELEPHONY_ERROR_NONE) {
-               _E("telephony_set_state_changed_cb failed %s", get_error_message(ret));
-               util_system_settings_unset_changed_cb(SYSTEM_SETTINGS_KEY_NETWORK_FLIGHT_MODE, _flight_mode);
-               return ret;
+       if (!rssi[SIM_1].initialized && !rssi[SIM_2].initialized) {
+               ret = telephony_set_state_changed_cb(_tel_ready_cb, data);
+               if (ret != TELEPHONY_ERROR_NONE) {
+                       _E("telephony_set_state_changed_cb failed %s", get_error_message(ret));
+                       util_system_settings_unset_changed_cb(SYSTEM_SETTINGS_KEY_NETWORK_FLIGHT_MODE, _flight_mode);
+                       return ret;
+               }
        }
 
        ret = telephony_get_state(&state);