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