[TSAM-9582] Fixed display issue when settings changed
[apps/native/ug-mobile-ap.git] / src / mh_connected_client.c
1 /*
2  * mh_connected_client.c
3  *
4  *  Created on: 05-Sep-2014
5  *      Author: sach.sharma
6  */
7 #include <time.h>
8
9 #include "mh_view_main.h"
10 #include "mobile_hotspot.h"
11 #include "mh_string.h"
12
13 static void __deconstruct_conn_clients_view(mh_appdata_t *ad)
14 {
15         __MOBILE_AP_FUNC_ENTER__;
16
17         mh_conn_client_view_t *client = &ad->connected_device;
18         int no_of_dev;
19         int i = 0;
20
21         no_of_dev = _get_list_clients_count(ad);
22         for (i = 0; i < no_of_dev; i++)
23                 _free_genlist_item(&ad->connected_device.station_items[i]);
24
25         _free_genlist_itc(&client->dev_itc[TETHERING_TYPE_WIFI]);
26         _free_genlist_itc(&client->dev_itc[TETHERING_TYPE_BT]);
27         _free_genlist_itc(&client->dev_itc[TETHERING_TYPE_USB]);
28
29         evas_object_del(client->genlist);
30         client->genlist = NULL;
31         client->navi_it = NULL;
32         _stop_update_device_conn_time(ad);
33
34         __MOBILE_AP_FUNC_EXIT__;
35 }
36
37 static void __update_connected_client_view(mh_appdata_t *ad)
38 {
39         __MOBILE_AP_FUNC_ENTER__;
40
41         if (ad == NULL) {
42                 ERR("Invalid param\n");
43                 return;
44         }
45
46         Elm_Object_Item *item = NULL;
47         tethering_type_e connection_type = 0;
48         GSList *l = NULL;
49         tethering_client_h *handle;
50         int count = 0;
51         mh_conn_client_view_t *cli_view = &(ad->connected_device);
52
53         elm_genlist_clear(cli_view->genlist);
54
55         for (l = ad->client_list; l != NULL; l = g_slist_next(l)) {
56                 handle = (tethering_client_h *)l->data;
57                 tethering_client_get_tethering_type(handle, &connection_type);
58
59                 item = elm_genlist_item_append(cli_view->genlist,
60                                 cli_view->dev_itc[connection_type],
61                                 (void *)handle,
62                                 NULL, ELM_GENLIST_ITEM_NONE,
63                                 NULL, NULL);
64                 if (item == NULL) {
65                         ERR("elm_genlist_item_append is failed\n");
66                         continue;
67                 }
68                 cli_view->station_items[count++] = item;
69                 elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
70         }
71         cli_view->no_of_clients = count;
72         _start_update_device_conn_time(ad);
73         __MOBILE_AP_FUNC_EXIT__;
74         return;
75 }
76
77 void _update_conn_clients(mh_appdata_t *ad)
78 {
79         __MOBILE_AP_FUNC_ENTER__;
80
81         if (ad == NULL) {
82                 ERR("Invalid param\n");
83                 return;
84         }
85         unsigned int no_of_dev = 0;
86         no_of_dev = _get_list_clients_count(ad);
87
88         if (no_of_dev == 0) {
89                 __deconstruct_conn_clients_view(ad);
90                 elm_naviframe_item_pop(ad->naviframe);
91         } else {
92                 __update_connected_client_view(ad);
93         }
94         __MOBILE_AP_FUNC_EXIT__;
95         return;
96 }
97
98 static char *__get_diff_time(time_t connection_time)
99 {
100         time_t current_time;
101         char buf[MH_LABEL_LENGTH_MAX] = {0, };
102         int day;
103         int hour;
104         int min;
105         int sec;
106         double diff;
107
108         time(&current_time);
109         diff = difftime(current_time, connection_time);
110         day = diff / (60 * 60 * 24);
111         diff = diff - (day * 60 * 60 * 24);
112         hour = diff / (60 * 60);
113         diff = diff - (hour * 60 * 60);
114         min = diff / 60;
115         diff = diff - (min * 60);
116         sec = diff;
117
118         if (day > 0)
119                 hour = hour + day * 24;
120
121         if (hour > 0)
122                 snprintf(buf, sizeof(buf), "%02d:%02d:%02d", hour, min, sec);
123         else
124                 snprintf(buf, sizeof(buf), "%02d:%02d", min, sec);
125
126         return g_strdup(buf);
127 }
128
129 static char *__gl_get_dev_label(void *data, Evas_Object *obj, const char *part)
130 {
131         __MOBILE_AP_FUNC_ENTER__;
132
133         tethering_client_h client = (tethering_client_h)data;
134         char *name = NULL;
135         char *dev_name = NULL;
136         time_t tm;
137
138         if (data == NULL || obj == NULL || part == NULL) {
139                 ERR("Invalid param\n");
140                 return NULL;
141         }
142
143         if (!strcmp("elm.text", part)) {
144                 tethering_client_get_name(client, &name);
145                 if (NULL == name)
146                         return NULL;
147
148                 if (!strcmp(name, "UNKNOWN")) {
149                         free(name);
150                         return strdup(STR_NO_NAME);
151                 }
152
153                 dev_name = elm_entry_utf8_to_markup(name);
154                 free(name);
155                 return dev_name;
156         } else if (!strcmp("elm.text.sub", part)) {
157                 tethering_client_get_time(client, &tm);
158                 return __get_diff_time(tm);
159         }
160
161         __MOBILE_AP_FUNC_EXIT__;
162         return NULL;
163 }
164
165 static Evas_Object *__gl_get_dev_wifi_icon(void *data, Evas_Object *obj,
166                                                         const char *part)
167 {
168         Evas_Object *ly = NULL;
169         Evas_Object *icon = NULL;
170
171         if (!strcmp("elm.swallow.icon", part)) {
172                 ly = elm_layout_add(obj);
173                 elm_layout_theme_set(ly, "layout", "list/C/type.1", "default");
174
175                 icon = elm_icon_add(obj);
176                 elm_image_file_set(icon, EDJDIR"/"TETHERING_IMAGES_EDJ, WIFI_ICON);
177                 evas_object_color_set(icon, 2, 61, 132, 255);
178                 evas_object_size_hint_align_set(icon, EVAS_HINT_FILL, EVAS_HINT_FILL);
179                 evas_object_size_hint_weight_set(icon, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
180                 elm_layout_content_set(ly, "elm.swallow.content", icon);
181         }
182
183         return ly;
184 }
185
186 static Evas_Object *__gl_get_dev_usb_icon(void *data, Evas_Object *obj,
187                                                         const char *part)
188 {
189         Evas_Object *ly = NULL;
190         Evas_Object *icon = NULL;
191
192         if (!strcmp("elm.swallow.icon", part)) {
193                 ly = elm_layout_add(obj);
194                 elm_layout_theme_set(ly, "layout", "list/C/type.1", "default");
195
196                 icon = elm_icon_add(obj);
197                 elm_image_file_set(icon, EDJDIR"/"TETHERING_IMAGES_EDJ, USB_ICON);
198                 evas_object_color_set(icon, 2, 61, 132, 255);
199                 evas_object_size_hint_align_set(icon, EVAS_HINT_FILL, EVAS_HINT_FILL);
200                 evas_object_size_hint_weight_set(icon, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
201                 elm_layout_content_set(ly, "elm.swallow.content", icon);
202         }
203
204         return ly;
205 }
206
207 static Evas_Object *__gl_get_dev_bt_icon(void *data, Evas_Object *obj,
208                                                         const char *part)
209 {
210         Evas_Object *ly = NULL;
211         Evas_Object *icon = NULL;
212
213         if (!strcmp("elm.swallow.icon", part)) {
214                 ly = elm_layout_add(obj);
215                 elm_layout_theme_set(ly, "layout", "list/C/type.1", "default");
216
217                 icon = elm_image_add(obj);
218                 elm_image_file_set(icon, EDJDIR"/"TETHERING_IMAGES_EDJ, BT_ICON);
219                 evas_object_color_set(icon, 2, 61, 132, 255);
220                 evas_object_size_hint_align_set(icon, EVAS_HINT_FILL, EVAS_HINT_FILL);
221                 evas_object_size_hint_weight_set(icon, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
222                 elm_layout_content_set(ly, "elm.swallow.content", icon);
223         }
224
225         return ly;
226 }
227
228 static void __set_genlist_itc(mh_appdata_t *ad)
229 {
230         __MOBILE_AP_FUNC_ENTER__;
231
232         ad->connected_device.dev_itc[TETHERING_TYPE_WIFI] = elm_genlist_item_class_new();
233         ad->connected_device.dev_itc[TETHERING_TYPE_WIFI]->item_style = MH_GENLIST_2LINE_TOP_TEXT_ICON_STYLE;
234         ad->connected_device.dev_itc[TETHERING_TYPE_WIFI]->func.text_get = __gl_get_dev_label;
235         ad->connected_device.dev_itc[TETHERING_TYPE_WIFI]->func.content_get = __gl_get_dev_wifi_icon;
236         ad->connected_device.dev_itc[TETHERING_TYPE_WIFI]->func.state_get = NULL;
237         ad->connected_device.dev_itc[TETHERING_TYPE_WIFI]->func.del = NULL;
238
239         ad->connected_device.dev_itc[TETHERING_TYPE_USB] = elm_genlist_item_class_new();
240         ad->connected_device.dev_itc[TETHERING_TYPE_USB]->item_style = MH_GENLIST_2LINE_TOP_TEXT_ICON_STYLE;
241         ad->connected_device.dev_itc[TETHERING_TYPE_USB]->func.text_get = __gl_get_dev_label;
242         ad->connected_device.dev_itc[TETHERING_TYPE_USB]->func.content_get = __gl_get_dev_usb_icon;
243         ad->connected_device.dev_itc[TETHERING_TYPE_USB]->func.state_get = NULL;
244         ad->connected_device.dev_itc[TETHERING_TYPE_USB]->func.del = NULL;
245
246         ad->connected_device.dev_itc[TETHERING_TYPE_BT] = elm_genlist_item_class_new();
247         ad->connected_device.dev_itc[TETHERING_TYPE_BT]->item_style = MH_GENLIST_2LINE_TOP_TEXT_ICON_STYLE;
248         ad->connected_device.dev_itc[TETHERING_TYPE_BT]->func.text_get = __gl_get_dev_label;
249         ad->connected_device.dev_itc[TETHERING_TYPE_BT]->func.content_get = __gl_get_dev_bt_icon;
250         ad->connected_device.dev_itc[TETHERING_TYPE_BT]->func.state_get = NULL;
251         ad->connected_device.dev_itc[TETHERING_TYPE_BT]->func.del = NULL;
252
253         __MOBILE_AP_FUNC_EXIT__;
254 }
255
256 static void __scroll_start_cb(void *data, Evas_Object *obj, void *event_info)
257 {
258         __MOBILE_AP_FUNC_ENTER__;
259
260         _stop_update_device_conn_time((mh_appdata_t *)data);
261         __MOBILE_AP_FUNC_EXIT__;
262 }
263
264 static void __scroll_stop_cb(void *data, Evas_Object *obj, void *event_info)
265 {
266         __MOBILE_AP_FUNC_ENTER__;
267
268         _start_update_device_conn_time((mh_appdata_t *)data);
269         __MOBILE_AP_FUNC_EXIT__;
270 }
271
272 static void __create_genlist(mh_appdata_t *ad)
273 {
274         __MOBILE_AP_FUNC_ENTER__;
275
276         if (ad == NULL) {
277                 ERR("ad is NULL\n");
278                 return;
279         }
280
281         Evas_Object *genlist;
282         Elm_Object_Item *item = NULL;
283         tethering_type_e connection_type = 0;
284         GSList *l = NULL;
285         tethering_client_h *handle;
286         int count = 0;
287
288         mh_conn_client_view_t *client = &ad->connected_device;
289
290         genlist = elm_genlist_add(ad->naviframe);
291         if (genlist == NULL) {
292                 ERR("genlist is NULL\n");
293                 return;
294         }
295
296         elm_genlist_mode_set(genlist, ELM_LIST_COMPRESS);
297         client->genlist = genlist;
298
299         __set_genlist_itc(ad);
300
301         for (l = ad->client_list; l != NULL; l = g_slist_next(l)) {
302                 handle = (tethering_client_h *)l->data;
303                 tethering_client_get_tethering_type(handle, &connection_type);
304
305                 item = elm_genlist_item_append(client->genlist,
306                                 client->dev_itc[connection_type],
307                                 (void *)handle,
308                                 NULL, ELM_GENLIST_ITEM_NONE,
309                                 NULL, NULL);
310                 if (item == NULL) {
311                         ERR("elm_genlist_item_append is failed\n");
312                         continue;
313                 }
314                 client->station_items[count++] = item;
315                 elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
316         }
317         evas_object_smart_callback_add(genlist, "scroll,anim,start",
318                                 __scroll_start_cb, ad);
319         evas_object_smart_callback_add(genlist, "scroll,drag,start",
320                                 __scroll_start_cb, ad);
321         evas_object_smart_callback_add(genlist, "scroll,anim,stop",
322                                 __scroll_stop_cb, ad);
323         evas_object_smart_callback_add(genlist, "scroll,drag,stop",
324                                 __scroll_stop_cb, ad);
325
326         client->no_of_clients = count;
327         _start_update_device_conn_time(ad);
328
329         __MOBILE_AP_FUNC_EXIT__;
330 }
331
332 static Eina_Bool __back_btn_cb(void *data, Elm_Object_Item *navi_item)
333 {
334         DBG("+\n");
335
336         if (data == NULL) {
337                 ERR("The param is NULL\n");
338                 return EINA_FALSE;
339         }
340
341         mh_appdata_t *ad = (mh_appdata_t *)data;
342
343         __deconstruct_conn_clients_view(ad);
344
345         DBG("-\n");
346         return EINA_TRUE;
347 }
348
349 void _create_connected_client_view(mh_appdata_t *ad)
350 {
351         DBG("+\n");
352         if (ad == NULL) {
353                 ERR("ad is NULL\n");
354                 return;
355         }
356
357         mh_conn_client_view_t *client = &ad->connected_device;
358
359         if (client->navi_it != NULL) {
360                 ERR("connected device view already exists\n");
361                 return;
362         }
363
364         __create_genlist(ad);
365         if (client->genlist == NULL) {
366                 ERR("__create_genlist failed NULL\n");
367                 return;
368         }
369
370         client->navi_it = elm_naviframe_item_push(ad->naviframe, STR_CONN_DEVICES, NULL, NULL, client->genlist, NULL);
371         elm_object_item_domain_text_translatable_set(client->navi_it, PKGNAME, EINA_TRUE);
372
373         elm_naviframe_item_pop_cb_set(client->navi_it, __back_btn_cb, (void *)ad);
374         DBG("-\n");
375 }