Remove unused layout style to show device icon
[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 *icon = NULL;
169
170         if (!strcmp("elm.swallow.icon", part)) {
171                 icon = elm_icon_add(obj);
172                 elm_image_file_set(icon, EDJDIR"/"TETHERING_IMAGES_EDJ, WIFI_ICON);
173                 evas_object_color_set(icon, 2, 61, 132, 204);
174                 evas_object_size_hint_min_set(icon, ELM_SCALE_SIZE(DEFAULT_ICON_SIZE), ELM_SCALE_SIZE(DEFAULT_ICON_SIZE));
175         }
176         return icon;
177 }
178
179 static Evas_Object *__gl_get_dev_usb_icon(void *data, Evas_Object *obj,
180                                                         const char *part)
181 {
182         Evas_Object *icon = NULL;
183
184         if (!strcmp("elm.swallow.icon", part)) {
185                 icon = elm_icon_add(obj);
186                 elm_image_file_set(icon, EDJDIR"/"TETHERING_IMAGES_EDJ, USB_ICON);
187                 evas_object_color_set(icon, 2, 61, 132, 204);
188                 evas_object_size_hint_min_set(icon, ELM_SCALE_SIZE(DEFAULT_ICON_SIZE), ELM_SCALE_SIZE(DEFAULT_ICON_SIZE));
189         }
190         return icon;
191 }
192
193 static Evas_Object *__gl_get_dev_bt_icon(void *data, Evas_Object *obj,
194                                                         const char *part)
195 {
196         Evas_Object *icon = NULL;
197
198         if (!strcmp("elm.swallow.icon", part)) {
199                 icon = elm_image_add(obj);
200                 elm_image_file_set(icon, EDJDIR"/"TETHERING_IMAGES_EDJ, BT_ICON);
201                 evas_object_color_set(icon, 2, 61, 132, 204);
202                 evas_object_size_hint_min_set(icon, ELM_SCALE_SIZE(DEFAULT_ICON_SIZE), ELM_SCALE_SIZE(DEFAULT_ICON_SIZE));
203         }
204         return icon;
205 }
206
207 static void __set_genlist_itc(mh_appdata_t *ad)
208 {
209         __MOBILE_AP_FUNC_ENTER__;
210
211         ad->connected_device.dev_itc[TETHERING_TYPE_WIFI] = elm_genlist_item_class_new();
212         ad->connected_device.dev_itc[TETHERING_TYPE_WIFI]->item_style = MH_GENLIST_2LINE_TOP_TEXT_ICON_STYLE;
213         ad->connected_device.dev_itc[TETHERING_TYPE_WIFI]->func.text_get = __gl_get_dev_label;
214         ad->connected_device.dev_itc[TETHERING_TYPE_WIFI]->func.content_get = __gl_get_dev_wifi_icon;
215         ad->connected_device.dev_itc[TETHERING_TYPE_WIFI]->func.state_get = NULL;
216         ad->connected_device.dev_itc[TETHERING_TYPE_WIFI]->func.del = NULL;
217
218         ad->connected_device.dev_itc[TETHERING_TYPE_USB] = elm_genlist_item_class_new();
219         ad->connected_device.dev_itc[TETHERING_TYPE_USB]->item_style = MH_GENLIST_2LINE_TOP_TEXT_ICON_STYLE;
220         ad->connected_device.dev_itc[TETHERING_TYPE_USB]->func.text_get = __gl_get_dev_label;
221         ad->connected_device.dev_itc[TETHERING_TYPE_USB]->func.content_get = __gl_get_dev_usb_icon;
222         ad->connected_device.dev_itc[TETHERING_TYPE_USB]->func.state_get = NULL;
223         ad->connected_device.dev_itc[TETHERING_TYPE_USB]->func.del = NULL;
224
225         ad->connected_device.dev_itc[TETHERING_TYPE_BT] = elm_genlist_item_class_new();
226         ad->connected_device.dev_itc[TETHERING_TYPE_BT]->item_style = MH_GENLIST_2LINE_TOP_TEXT_ICON_STYLE;
227         ad->connected_device.dev_itc[TETHERING_TYPE_BT]->func.text_get = __gl_get_dev_label;
228         ad->connected_device.dev_itc[TETHERING_TYPE_BT]->func.content_get = __gl_get_dev_bt_icon;
229         ad->connected_device.dev_itc[TETHERING_TYPE_BT]->func.state_get = NULL;
230         ad->connected_device.dev_itc[TETHERING_TYPE_BT]->func.del = NULL;
231
232         __MOBILE_AP_FUNC_EXIT__;
233 }
234
235 static void __scroll_start_cb(void *data, Evas_Object *obj, void *event_info)
236 {
237         __MOBILE_AP_FUNC_ENTER__;
238
239         _stop_update_device_conn_time((mh_appdata_t *)data);
240         __MOBILE_AP_FUNC_EXIT__;
241 }
242
243 static void __scroll_stop_cb(void *data, Evas_Object *obj, void *event_info)
244 {
245         __MOBILE_AP_FUNC_ENTER__;
246
247         _start_update_device_conn_time((mh_appdata_t *)data);
248         __MOBILE_AP_FUNC_EXIT__;
249 }
250
251 static void __create_genlist(mh_appdata_t *ad)
252 {
253         __MOBILE_AP_FUNC_ENTER__;
254
255         if (ad == NULL) {
256                 ERR("ad is NULL\n");
257                 return;
258         }
259
260         Evas_Object *genlist;
261         Elm_Object_Item *item = NULL;
262         tethering_type_e connection_type = 0;
263         GSList *l = NULL;
264         tethering_client_h *handle;
265         int count = 0;
266
267         mh_conn_client_view_t *client = &ad->connected_device;
268
269         genlist = elm_genlist_add(ad->naviframe);
270         if (genlist == NULL) {
271                 ERR("genlist is NULL\n");
272                 return;
273         }
274
275         elm_genlist_mode_set(genlist, ELM_LIST_COMPRESS);
276         client->genlist = genlist;
277
278         __set_genlist_itc(ad);
279
280         for (l = ad->client_list; l != NULL; l = g_slist_next(l)) {
281                 handle = (tethering_client_h *)l->data;
282                 tethering_client_get_tethering_type(handle, &connection_type);
283
284                 item = elm_genlist_item_append(client->genlist,
285                                 client->dev_itc[connection_type],
286                                 (void *)handle,
287                                 NULL, ELM_GENLIST_ITEM_NONE,
288                                 NULL, NULL);
289                 if (item == NULL) {
290                         ERR("elm_genlist_item_append is failed\n");
291                         continue;
292                 }
293                 client->station_items[count++] = item;
294                 elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
295         }
296         evas_object_smart_callback_add(genlist, "scroll,anim,start",
297                                 __scroll_start_cb, ad);
298         evas_object_smart_callback_add(genlist, "scroll,drag,start",
299                                 __scroll_start_cb, ad);
300         evas_object_smart_callback_add(genlist, "scroll,anim,stop",
301                                 __scroll_stop_cb, ad);
302         evas_object_smart_callback_add(genlist, "scroll,drag,stop",
303                                 __scroll_stop_cb, ad);
304
305         client->no_of_clients = count;
306         _start_update_device_conn_time(ad);
307
308         __MOBILE_AP_FUNC_EXIT__;
309 }
310
311 static Eina_Bool __back_btn_cb(void *data, Elm_Object_Item *navi_item)
312 {
313         DBG("+\n");
314
315         if (data == NULL) {
316                 ERR("The param is NULL\n");
317                 return EINA_FALSE;
318         }
319
320         mh_appdata_t *ad = (mh_appdata_t *)data;
321
322         __deconstruct_conn_clients_view(ad);
323         _ctxpopup_more_button_callback_add(ad);
324
325         DBG("-\n");
326         return EINA_TRUE;
327 }
328
329 void _create_connected_client_view(mh_appdata_t *ad)
330 {
331         DBG("+\n");
332         if (ad == NULL) {
333                 ERR("ad is NULL\n");
334                 return;
335         }
336
337         mh_conn_client_view_t *client = &ad->connected_device;
338
339         if (client->navi_it != NULL) {
340                 ERR("connected device view already exists\n");
341                 return;
342         }
343
344         __create_genlist(ad);
345         if (client->genlist == NULL) {
346                 ERR("__create_genlist failed NULL\n");
347                 return;
348         }
349
350         client->navi_it = elm_naviframe_item_push(ad->naviframe, STR_CONN_DEVICES, NULL, NULL, client->genlist, NULL);
351         elm_object_item_domain_text_translatable_set(client->navi_it, PKGNAME, EINA_TRUE);
352
353         elm_naviframe_item_pop_cb_set(client->navi_it, __back_btn_cb, (void *)ad);
354         DBG("-\n");
355 }