Apply Tizen coding rule
[apps/native/ug-mobile-ap.git] / src / mh_popup.c
1 /*
2 * ug-mobile-ap
3 *
4 * Copyright 2012  Samsung Electronics Co., Ltd
5
6 * Licensed under the Flora License, Version 1.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
9
10 * http://www.tizenopensource.org/license
11
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
17 *
18 */
19
20 #include <efl_extension.h>
21 #include <app_control_internal.h>
22
23 #include "mh_common_utility.h"
24 #include "mobile_hotspot.h"
25 #include "mh_popup.h"
26 #include "mh_string.h"
27
28 static mh_popup_type_e popup_type = MH_POPUP_NONE;
29 static Evas_Object *popup_content = NULL;
30 static char *popup_string = NULL;
31
32 static void __launch_network_app(void)
33 {
34         int ret = APP_CONTROL_ERROR_NONE;
35         app_control_h app_control;
36
37         app_control_create(&app_control);
38         if (ret != APP_CONTROL_ERROR_NONE) {
39                 ERR("app_control_create failed");
40                 return;
41         }
42         app_control_set_operation(app_control, APP_CONTROL_OPERATION_DEFAULT);
43         app_control_set_launch_mode(app_control, APP_CONTROL_LAUNCH_MODE_GROUP);
44         app_control_set_app_id(app_control, "setting-network-efl");
45
46         ret = app_control_send_launch_request(app_control, NULL, NULL);
47         if (ret == APP_CONTROL_ERROR_NONE)
48                 DBG("Launch network ug successful");
49         else
50                 ERR("Fail to launch network ug");
51
52         app_control_destroy(app_control);
53 }
54
55 static void __handle_popup_resp(void *data, bool response)
56 {
57         __MOBILE_AP_FUNC_ENTER__;
58
59         if (data == NULL) {
60                 ERR("The param is NULL\n");
61                 return;
62         }
63
64         mh_appdata_t *ad = (mh_appdata_t *)data;
65         int ret = 0;
66         Eina_Bool state = 0;
67
68         if (ad->popup_checkbox) {
69                 state = elm_check_state_get(ad->popup_checkbox);
70                 evas_object_del(ad->popup_checkbox);
71                 ad->popup_checkbox = NULL;
72                 DBG("Checkbox status is = %d\n", state);
73         }
74         if (ad->popup) {
75                 evas_object_del(ad->popup);
76                 ad->popup = NULL;
77         }
78
79         if (response == true) {
80                 switch (popup_type) {
81                 case MH_POPUP_WIFI_ON_CHECKBOX:
82                         if (state)
83                                 _set_checkbox_status(TETHERING_TYPE_WIFI, 1);
84
85                         ad->is_wifi_teth_enabling = false;
86                         ret = tethering_enable(ad->handle, TETHERING_TYPE_WIFI);
87                         if (ret != TETHERING_ERROR_NONE) {
88                                 ERR("wifi tethering on is failed : %d\n", ret);
89                                 _update_wifi_item(ad, MH_STATE_NONE);
90                         }
91                         _wifi_tethering_checkbox_popup_status_set(false);
92                         _send_signal_qp(QP_SIGNAL_PROGRESS_ON);
93                         break;
94
95                 case MH_POPUP_BT_ON_CHECKBOX:
96                         if (state)
97                                 _set_checkbox_status(TETHERING_TYPE_BT, 1);
98
99                         ad->is_bt_teth_enabling = false;
100                         ret = tethering_enable(ad->handle, TETHERING_TYPE_BT);
101                         if (ret != TETHERING_ERROR_NONE) {
102                                 ERR("Error enable bt tethering : %d\n", ret);
103                                 _update_bt_item(ad, MH_STATE_NONE);
104                         }
105                         break;
106
107                 case MH_POPUP_USB_ON_CHECKBOX:
108                         if (state)
109                                 _set_checkbox_status(TETHERING_TYPE_USB, 1);
110
111                         if (_get_vconf_usb_state() != VCONFKEY_SYSMAN_USB_AVAILABLE) {
112                                 _update_tethering_item(ad, MH_STATE_NONE);
113                                 break;
114                         }
115                         ad->is_usb_teth_enabling = false;
116                         ret = tethering_enable(ad->handle, TETHERING_TYPE_USB);
117                         if (ret != TETHERING_ERROR_NONE) {
118                                 ERR("Error enable usb tethering : %d\n", ret);
119                                 _update_usb_item(ad, MH_STATE_NONE);
120                         }
121                         break;
122
123                 case MH_POPUP_WIFI_OFF:
124                         ret = tethering_disable(ad->handle, TETHERING_TYPE_WIFI);
125                         if (ret != TETHERING_ERROR_NONE) {
126                                 ERR("wifi tethering off is failed : %d\n", ret);
127                                 _update_wifi_item(ad, MH_STATE_NONE);
128                         }
129                         _send_signal_qp(QP_SIGNAL_PROGRESS_OFF);
130                         break;
131
132                 case MH_POPUP_MOBILE_DATA_OFF:
133                         __launch_network_app();
134                         _update_tethering_enabling_item(ad, ad->type, MH_STATE_NONE);
135                         break;
136
137                 default:
138                         ERR("Unknown popup_type : %d\n", popup_type);
139                         break;
140                 }
141         } else {
142                 switch (popup_type) {
143                 case MH_POPUP_WIFI_ON_CHECKBOX:
144                         _update_tethering_enabling_item(ad, TETHERING_TYPE_WIFI, MH_STATE_NONE);
145                         _send_signal_qp(QP_SIGNAL_PROGRESS_RESET);
146                         _wifi_tethering_checkbox_popup_status_set(false);
147                         break;
148
149                 case MH_POPUP_BT_ON_CHECKBOX:
150                         _update_tethering_enabling_item(ad, TETHERING_TYPE_BT, MH_STATE_NONE);
151                         break;
152
153                 case MH_POPUP_USB_ON_CHECKBOX:
154                         _update_tethering_enabling_item(ad, TETHERING_TYPE_USB, MH_STATE_NONE);
155                         break;
156
157                 case MH_POPUP_WIFI_AP_OFF:
158                         if (ad->setup.genlist)
159                                 elm_naviframe_item_pop(ad->naviframe);
160                         elm_naviframe_item_pop(ad->naviframe);
161                         break;
162
163                 case MH_POPUP_WIFI_OFF:
164                         _update_tethering_enabling_item(ad, TETHERING_TYPE_WIFI, MH_STATE_NONE);
165                         _send_signal_qp(QP_SIGNAL_PROGRESS_RESET);
166                         break;
167
168                 case MH_POPUP_MOBILE_DATA_OFF:
169                         _update_tethering_enabling_item(ad, ad->type, MH_STATE_NONE);
170                         break;
171                 default:
172                         ERR("Unknown popup_type : %d\n", popup_type);
173                         break;
174                 }
175         }
176
177         __MOBILE_AP_FUNC_EXIT__;
178 }
179
180 void _teth_on(mh_appdata_t *ad)
181 {
182         __handle_popup_resp(ad, true);
183 }
184
185 static void __popup_yes_btn_clicked_cb(void *data, Evas_Object *obj, void *event_info)
186 {
187         if (data == NULL || obj == NULL) {
188                 ERR("The param is NULL\n");
189                 return;
190         }
191
192         __handle_popup_resp(data, true);
193 }
194
195 static void __popup_no_btn_clicked_cb(void *data, Evas_Object *obj, void *event_info)
196 {
197         if (data == NULL || obj == NULL) {
198                 ERR("The param is NULL\n");
199                 return;
200         }
201
202         __handle_popup_resp(data, false);
203 }
204
205 static void __popup_no_btn_mouse_event_cb(void *data, Evas *evas, Evas_Object *obj, void *event_info)
206 {
207         if (data == NULL || obj == NULL) {
208                 ERR("The param is NULL\n");
209                 return;
210         }
211
212         Evas_Event_Mouse_Up *ev = event_info;
213
214         if (ev->button == 3)
215                 __handle_popup_resp(data, false);
216 }
217
218 static void __popup_block_clicked_cb(void *data, Evas_Object *obj, void *event_info)
219 {
220         if (obj == NULL) {
221                 ERR("The param is NULL\n");
222                 return;
223         }
224
225         elm_popup_dismiss(obj);
226 }
227
228 static void __popup_hide_finished_cb(void *data, Evas_Object *obj, void *event_info)
229 {
230         if (data == NULL) {
231                 ERR("The param is NULL\n");
232                 return;
233         }
234
235         __handle_popup_resp(data, false);
236 }
237
238 void _prepare_popup_with_content(int type, Evas_Object *obj)
239 {
240         __MOBILE_AP_FUNC_ENTER__;
241
242         if (obj == NULL) {
243                 ERR("param is NULL\n");
244                 return;
245         }
246
247         popup_type = type;
248
249         if (popup_content)
250                 evas_object_del(popup_content);
251         popup_content = obj;
252
253         if (popup_string) {
254                 free(popup_string);
255                 popup_string = NULL;
256         }
257
258         __MOBILE_AP_FUNC_EXIT__;
259 }
260
261 void _prepare_popup(int type, const char *str)
262 {
263         __MOBILE_AP_FUNC_ENTER__;
264
265         if (str == NULL) {
266                 ERR("param is NULL\n");
267                 return;
268         }
269         popup_type = type;
270
271         popup_content = NULL;
272
273         if (popup_string)
274                 free(popup_string);
275
276         popup_string = strndup(str, MH_LABEL_LENGTH_MAX);
277         if (popup_string == NULL)
278                 ERR("strndup is failed\n");
279
280         __MOBILE_AP_FUNC_EXIT__;
281 }
282
283 void _prepare_popup_type(int type)
284 {
285         popup_type = type;
286 }
287
288 static void __language_changed_cb(void *data, Evas_Object *obj, void *event_info)
289 {
290         __MOBILE_AP_FUNC_ENTER__;
291
292         mh_appdata_t *ad = (mh_appdata_t *)data;
293         Evas_Object *label = NULL;
294         bool wifi_state = false;
295         char *fmt = NULL;
296         char str[MH_LABEL_LENGTH_MAX];
297
298         if (ad->type < TETHERING_TYPE_USB || ad->type > TETHERING_TYPE_BT) {
299                 ERR("Invalid Tethering type\n");
300                 return;
301         }
302
303         switch (ad->type) {
304         case TETHERING_TYPE_WIFI:
305                 wifi_is_activated(&wifi_state);
306                 _set_vconf_prev_wifi_state(wifi_state);
307                 if (wifi_state == true || _is_wifi_direct_on() == true)
308                         fmt = STR_TETH_ON_DESC_1;
309                 else
310                         fmt = STR_TETH_ON_DESC_2;
311
312                 snprintf(str, MH_LABEL_LENGTH_MAX, fmt, TETHERING_WIFI_MAX_CONNECTED_STA);
313                 break;
314
315         case TETHERING_TYPE_BT:
316                 fmt = STR_TETH_ON_DESC_2;
317                 snprintf(str, MH_LABEL_LENGTH_MAX, fmt, TETHERING_BT_MAX_CONNECTED_STA);
318                 break;
319
320         case TETHERING_TYPE_USB:
321                 snprintf(str, MH_LABEL_LENGTH_MAX, STR_TETH_ON_DESC_3);
322                 break;
323         default:
324                 break;
325         }
326
327         label = elm_label_add(ad->main.check_popup_ly);
328         elm_object_style_set(label, "popup/default");
329         elm_label_line_wrap_set(label, ELM_WRAP_MIXED);
330         elm_object_text_set(label, str);
331         evas_object_size_hint_weight_set(label, EVAS_HINT_EXPAND, 0.0);
332         evas_object_size_hint_align_set(label, EVAS_HINT_FILL, EVAS_HINT_FILL);
333         evas_object_show(label);
334         elm_object_part_content_set(ad->main.check_popup_ly, "elm.swallow.content", label);
335
336         __MOBILE_AP_FUNC_EXIT__;
337 }
338
339 static void __popup_with_checkbox(mh_appdata_t *ad)
340 {
341         __MOBILE_AP_FUNC_ENTER__;
342
343         Evas_Object *popup = NULL;
344         Evas_Object *yes_button = NULL;
345         Evas_Object *cancel_button = NULL;
346         Evas_Object *layout = NULL;
347         Evas_Object *label = NULL;
348         Evas_Object *check = NULL;
349
350         popup = elm_popup_add(ad->win);
351         elm_popup_align_set(popup, ELM_NOTIFY_ALIGN_FILL, 1.0);
352         evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
353         ad->popup = popup;
354         switch (ad->type) {
355         case TETHERING_TYPE_WIFI:
356                 elm_object_domain_translatable_part_text_set(popup, "title,text", PACKAGE,
357                                 "IDS_MOBILEAP_MBODY_WI_FI_TETHERING");
358                 break;
359         case TETHERING_TYPE_BT:
360                 elm_object_domain_translatable_part_text_set(popup, "title,text", PACKAGE,
361                                 "IDS_MOBILEAP_BODY_BLUETOOTH_TETHERING");
362                 break;
363         case TETHERING_TYPE_USB:
364                 elm_object_domain_translatable_part_text_set(popup, "title,text", PACKAGE,
365                                 "IDS_MOBILEAP_MBODY_USB_TETHERING");
366                 break;
367         default:
368                 break;
369         }
370
371         /* layout */
372         layout = elm_layout_add(popup);
373         elm_layout_file_set(layout, FILE_PATH_OF_EDC, "popup_checkview_layout");
374         evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
375         evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, 1.0);
376         ad->main.check_popup_ly = layout;
377
378         /* check */
379         check = elm_check_add(popup);
380         elm_object_style_set(check, "popup");
381         elm_object_domain_translatable_text_set(check, PACKAGE, STR_NO_SHOW_AGAIN);
382         evas_object_size_hint_align_set(check, EVAS_HINT_FILL, EVAS_HINT_FILL);
383         evas_object_size_hint_weight_set(check, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
384         elm_object_part_content_set(layout, "elm.swallow.end", check);
385         ad->popup_checkbox = check;
386
387         /* label */
388         label = elm_label_add(layout);
389         elm_object_style_set(label, "popup/default");
390         elm_label_line_wrap_set(label, ELM_WRAP_MIXED);
391         elm_object_text_set(label, popup_string);
392         evas_object_size_hint_weight_set(label, EVAS_HINT_EXPAND, 0.0);
393         evas_object_size_hint_align_set(label, EVAS_HINT_FILL, EVAS_HINT_FILL);
394         evas_object_show(label);
395         elm_object_part_content_set(layout, "elm.swallow.content", label);
396
397         cancel_button = _create_button(popup,  "IDS_BR_SK_CANCEL",
398                                 "button1", __popup_no_btn_clicked_cb, ad);
399         yes_button = _create_button(popup, "IDS_ST_BUTTON_ENABLE_M_USE",
400                                 "button2", __popup_yes_btn_clicked_cb, ad);
401
402         evas_object_smart_callback_add(popup, "language,changed", __language_changed_cb, ad);
403
404         eext_object_event_callback_add(popup, EEXT_CALLBACK_BACK,
405                         __popup_no_btn_clicked_cb, (void *)ad);
406
407         evas_object_event_callback_add(popup, EVAS_CALLBACK_MOUSE_UP,
408                         __popup_no_btn_mouse_event_cb, (void *)ad);
409         evas_object_smart_callback_add(popup, "block,clicked",
410                         __popup_block_clicked_cb, NULL);
411         evas_object_smart_callback_add(popup, "dismissed",
412                         __popup_hide_finished_cb, ad);
413
414
415         if (check && yes_button) {
416                 elm_object_focus_next_object_set(check, yes_button, ELM_FOCUS_PREVIOUS);
417                 elm_object_focus_next_object_set(yes_button, check, ELM_FOCUS_NEXT);
418                 if (cancel_button) {
419                         elm_object_focus_next_object_set(cancel_button, check, ELM_FOCUS_PREVIOUS);
420                         elm_object_focus_next_object_set(check , cancel_button, ELM_FOCUS_NEXT);
421                 }
422         }
423
424         elm_object_content_set(popup, layout);
425         evas_object_show(popup);
426         ad->popup = popup;
427
428         __MOBILE_AP_FUNC_EXIT__;
429 }
430
431 Eina_Bool _create_popup(mh_appdata_t *ad)
432 {
433         __MOBILE_AP_FUNC_ENTER__;
434
435         Evas_Object *popup = NULL;
436         Evas_Object *cancel_button = NULL;
437         Evas_Object *yes_button = NULL;
438
439         if (ad == NULL) {
440                 ERR("The param is NULL\n");
441                 if (popup_string) {
442                         free(popup_string);
443                         popup_string = NULL;
444                 }
445                 popup_content = NULL;
446
447                 return EINA_FALSE;
448         }
449
450         if (ad->popup != NULL) {
451                 evas_object_del(ad->popup);
452                 ad->popup = NULL;
453         }
454         ad->popup_checkbox = NULL;
455         DBG("popup type : %d", popup_type);
456
457         switch (popup_type) {
458         case MH_POPUP_WIFI_ON_CHECKBOX:
459         case MH_POPUP_BT_ON_CHECKBOX:
460         case MH_POPUP_USB_ON_CHECKBOX:
461                 __popup_with_checkbox(ad);
462                 break;
463
464         case MH_POPUP_WIFI_OFF:
465                 popup = elm_popup_add(ad->win);
466                 ad->popup = popup;
467
468                 elm_object_domain_translatable_part_text_set(popup, "title,text", PACKAGE,
469                                 "IDS_MOBILEAP_MBODY_WI_FI_TETHERING");
470
471                 evas_object_size_hint_weight_set(popup,
472                                 EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
473
474                 if (popup_content == NULL)
475                         elm_object_domain_translatable_text_set(popup, PACKAGE, popup_string);
476                 else
477                         elm_object_content_set(popup, popup_content);
478
479                 cancel_button = _create_button(popup, STR_CANCEL,
480                                 "button1", __popup_no_btn_clicked_cb, ad);
481                 yes_button = _create_button(popup, STR_TURN_OFF,
482                                 "button2", __popup_yes_btn_clicked_cb, ad);
483
484                 eext_object_event_callback_add(popup, EEXT_CALLBACK_BACK,
485                                 __popup_no_btn_clicked_cb, (void *)ad);
486                 evas_object_event_callback_add(popup, EVAS_CALLBACK_MOUSE_UP,
487                                 __popup_no_btn_mouse_event_cb, (void *)ad);
488                 evas_object_smart_callback_add(popup, "block,clicked",
489                                 __popup_block_clicked_cb, NULL);
490                 evas_object_smart_callback_add(popup, "dismissed",
491                                 __popup_hide_finished_cb, ad);
492
493                 evas_object_show(popup);
494                 break;
495
496         case MH_POPUP_TETH_ENABLING_FAILED:
497         case MH_POPUP_NO_SIM:
498         case MH_POPUP_FLIGHT_MODE:
499         case MH_POPUP_NETWORK_OUT_OF_RANGE:
500                 popup = elm_popup_add(ad->win);
501                 ad->popup = popup;
502                 evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND,
503                                 EVAS_HINT_EXPAND);
504
505                 if (popup_content == NULL)
506                         elm_object_domain_translatable_text_set(popup, PACKAGE, popup_string);
507                 else
508                         elm_object_content_set(popup, popup_content);
509                 elm_object_domain_translatable_part_text_set(popup, "title,text", PACKAGE,
510                                 STR_NO_NET_CONN);
511                 cancel_button = _create_button(popup,  STR_CANCEL,
512                                 "button1", __popup_no_btn_clicked_cb, ad);
513
514                 eext_object_event_callback_add(popup, EEXT_CALLBACK_BACK,
515                                 __popup_no_btn_clicked_cb, (void *)ad);
516                 evas_object_event_callback_add(popup, EVAS_CALLBACK_MOUSE_UP,
517                                 __popup_no_btn_mouse_event_cb, (void *)ad);
518                 evas_object_smart_callback_add(popup, "block,clicked",
519                                 __popup_block_clicked_cb, NULL);
520                 evas_object_smart_callback_add(popup, "dismissed",
521                                 __popup_hide_finished_cb, ad);
522
523                 evas_object_show(popup);
524                 break;
525
526         case MH_POPUP_MOBILE_DATA_OFF:
527                 popup = elm_popup_add(ad->win);
528                 ad->popup = popup;
529                 evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND,
530                                 EVAS_HINT_EXPAND);
531
532                 if (popup_content == NULL)
533                         elm_object_domain_translatable_text_set(popup, PACKAGE, popup_string);
534                 else
535                         elm_object_content_set(popup, popup_content);
536                 elm_object_domain_translatable_part_text_set(popup, "title,text", PACKAGE,
537                                 STR_NO_NET_CONN);
538                 cancel_button = _create_button(popup,  STR_CANCEL,
539                                 "button1", __popup_no_btn_clicked_cb, ad);
540                 yes_button = _create_button(popup, STR_SETTING,
541                                 "button2", __popup_yes_btn_clicked_cb, ad);
542
543                 eext_object_event_callback_add(popup, EEXT_CALLBACK_BACK,
544                                 __popup_no_btn_clicked_cb, (void *)ad);
545                 evas_object_event_callback_add(popup, EVAS_CALLBACK_MOUSE_UP,
546                                 __popup_no_btn_mouse_event_cb, (void *)ad);
547                 evas_object_smart_callback_add(popup, "block,clicked",
548                                 __popup_block_clicked_cb, NULL);
549                 evas_object_smart_callback_add(popup, "dismissed",
550                                 __popup_hide_finished_cb, ad);
551
552                 evas_object_show(popup);
553                 break;
554
555         case MH_POPUP_WIFI_AP_OFF:
556                 popup = elm_popup_add(ad->win);
557                 ad->popup = popup;
558                 evas_object_size_hint_weight_set(popup,
559                                 EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
560
561                 elm_object_domain_translatable_part_text_set(popup, "title,text", PACKAGE,
562                                 STR_TETH);
563                 if (popup_content == NULL)
564                         elm_object_domain_translatable_text_set(popup, PACKAGE, popup_string);
565                 else
566                         elm_object_content_set(popup, popup_content);
567
568                 cancel_button = _create_button(popup,  STR_CANCEL,
569                                 "button1", __popup_no_btn_clicked_cb, ad);
570                 yes_button = _create_button(popup, STR_ENABLE,
571                                 "button2", __popup_yes_btn_clicked_cb, ad);
572
573                 eext_object_event_callback_add(popup, EEXT_CALLBACK_BACK,
574                                 __popup_no_btn_clicked_cb, (void *)ad);
575                 evas_object_event_callback_add(popup, EVAS_CALLBACK_MOUSE_UP,
576                                 __popup_no_btn_mouse_event_cb, (void *)ad);
577
578                 evas_object_show(popup);
579                 break;
580
581         default:
582                 ERR("Unknown popup_type : %d\n", popup_type);
583                 break;
584         }
585
586         if (cancel_button && yes_button) {
587                 elm_object_focus_next_object_set(cancel_button, yes_button, ELM_FOCUS_PREVIOUS);
588                 elm_object_focus_next_object_set(yes_button, cancel_button, ELM_FOCUS_NEXT);
589         }
590
591         if (popup_string) {
592                 free(popup_string);
593                 popup_string = NULL;
594         }
595         popup_content = NULL;
596
597         __MOBILE_AP_FUNC_EXIT__;
598
599         return EINA_TRUE;
600 }
601
602 void _destroy_popup(mh_appdata_t *ad)
603 {
604         __MOBILE_AP_FUNC_ENTER__;
605
606         if (ad == NULL) {
607                 ERR("ad is null\n");
608                 return;
609         }
610
611         if (ad->popup) {
612                 evas_object_del(ad->popup);
613                 ad->popup = NULL;
614         }
615         ad->popup_checkbox = NULL;
616
617         if (popup_string) {
618                 free(popup_string);
619                 popup_string = NULL;
620         }
621         popup_content = NULL;
622         popup_type = MH_POPUP_NONE;
623
624         __MOBILE_AP_FUNC_EXIT__;
625
626         return;
627 }