Merge ode app and ode-gui app
[platform/core/security/ode.git] / tools / apps / ode / src / ode-app.c
1 /*
2  * Tizen ODE application
3  *
4  * Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved
5  *
6  * Contact: SeolHeui Kim <s414.kim@samsung.com>
7  *
8  * Licensed under the Apache License, Version 2.0 (the "License");
9  * you may not use this file except in compliance with the License.
10  * You may obtain a copy of the License at
11  *
12  * http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing, software
15  * distributed under the License is distributed on an "AS IS" BASIS,
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * See the License for the specific language governing permissions and
18  * limitations under the License.
19  *
20  */
21
22 #include "ode-app.h"
23
24 int launchpad_main(int argc, char *argv[]);
25 int standalone_main(int argc, char *argv[]);
26
27 struct submain {
28         const char* name;
29         int (*main)(int argc, char* argv[]);
30 } submains[] = {
31         {
32                 .name = PACKAGE,
33                 .main = launchpad_main
34         },
35         {
36                 .name = "ode",
37                 .main = standalone_main
38         },
39 };
40
41 static Evas_Object* create_mainview(appdata_s* ad)
42 {
43         Evas_Object* base_layout = NULL;
44         Evas_Object* navi_bar = NULL;
45
46         base_layout = dpm_encryption_create_layout(ad->conform, NULL, NULL);
47
48         navi_bar = dpm_encryption_create_navigation(base_layout);
49         elm_naviframe_prev_btn_auto_pushed_set(navi_bar, EINA_TRUE);
50         ad->navi_bar = navi_bar;
51
52         switch (ad->view_type) {
53         case ENCRYPT_DEVICE:
54                 dpm_encryption_create_view(ad);
55                 break;
56         case DECRYPT_DEVICE:
57                 dpm_decryption_create_view(ad);
58                 break;
59         case ENCRYPT_SD_CARD:
60                 dpm_encryption_sd_card_create_view(ad);
61                 break;
62         case DECRYPT_SD_CARD:
63                 dpm_decryption_sd_card_create_view(ad);
64                 break;
65         }
66         return base_layout;
67 }
68
69 static void win_delete_request_cb(void* data, Evas_Object* obj, void* event_info)
70 {
71         ui_app_exit();
72 }
73
74 static Eina_Bool _home_key_cb(void *data, int type, void *event)
75 {
76         Evas_Event_Key_Down *ev = event;
77         if (!strcmp(ev->keyname, "XF86Home"))
78                 ui_app_exit();
79         return EINA_TRUE;
80 }
81
82 static int create_base_gui(appdata_s* ad)
83 {
84         dlog_print(DLOG_DEBUG, LOG_TAG, "### create base gui start  ###");
85         char* res_path = NULL;
86         char edj_path[PATH_MAX], icon_check_path[PATH_MAX], icon_bar_path[PATH_MAX] = "\0";
87
88         /* get EDJ & icon path */
89         res_path = app_get_resource_path();
90         if (res_path == NULL) {
91                 dlog_print(DLOG_ERROR, LOG_TAG, "failed get resource path");
92                 ui_app_exit();
93                 return 1;
94         }
95         snprintf(edj_path, PATH_MAX, "%s%s", res_path, "org.tizen.ode.edj");
96         ad->edj_path = strdup(edj_path);
97         snprintf(icon_check_path, PATH_MAX, "%s%s", res_path, "images/icon_encrypt_check.png");
98         ad->icon_check_path = strdup(icon_check_path);
99         snprintf(icon_bar_path, PATH_MAX, "%s%s", res_path, "images/icon_encrypt_bar.png");
100         ad->icon_bar_path = strdup(icon_bar_path);
101         free(res_path);
102
103         /* Window */
104         ad->win = elm_win_util_standard_add(PACKAGE, PACKAGE);
105         elm_win_conformant_set(ad->win, EINA_TRUE);
106         elm_win_autodel_set(ad->win, EINA_TRUE);
107         evas_object_smart_callback_add(ad->win, "delete,request", win_delete_request_cb, NULL);
108
109         /* Conformant */
110         ad->conform = elm_conformant_add(ad->win);
111         evas_object_size_hint_weight_set(ad->conform, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
112         elm_win_resize_object_add(ad->win, ad->conform);
113         evas_object_show(ad->conform);
114
115         /* Indicator */
116         elm_win_indicator_mode_set(ad->win, ELM_WIN_INDICATOR_SHOW);
117         elm_win_indicator_opacity_set(ad->win, ELM_WIN_INDICATOR_TRANSPARENT);
118
119         ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, _home_key_cb, NULL);
120
121         ad->base = create_mainview(ad);
122         elm_object_content_set(ad->conform, ad->base);
123         evas_object_show(ad->win);
124
125         return 0;
126 }
127
128 static bool app_create(void* data)
129 {
130         return true;
131 }
132
133 static void app_control(app_control_h app_control, void* data)
134 {
135         /* Handle the launch request. */
136         appdata_s* ad = (appdata_s*)data;
137         int ret;
138         char *viewtype = NULL;
139
140         ret = app_control_get_extra_data(app_control, "viewtype", &viewtype);
141         if (ret != APP_CONTROL_ERROR_NONE) {
142                 dlog_print(DLOG_ERROR, LOG_TAG, "failed to get viewtype");
143                 ui_app_exit();
144         }
145
146         dlog_print(DLOG_DEBUG, LOG_TAG, "viewtype is %s", viewtype);
147         if (!strcmp(viewtype, "ENCRYPT_DEVICE"))
148                 ad->view_type = ENCRYPT_DEVICE;
149         else if (!strcmp(viewtype, "DECRYPT_DEVICE"))
150                 ad->view_type = DECRYPT_DEVICE;
151         else if (!strcmp(viewtype, "ENCRYPT_SD_CARD"))
152                 ad->view_type = ENCRYPT_SD_CARD;
153         else if (!strcmp(viewtype, "DECRYPT_SD_CARD"))
154                 ad->view_type = DECRYPT_SD_CARD;
155
156         if (viewtype) {
157                 free(viewtype);
158         }
159
160         elm_app_base_scale_set(1.8);
161
162         if (create_base_gui(ad) != 0) {
163                 dlog_print(DLOG_ERROR, LOG_TAG, "### create base gui fail ###");
164                 return;
165         }
166 }
167
168 static void app_pause(void* data)
169 {
170         /* Take necessary actions when application becomes invisible. */
171 }
172
173 static void app_resume(void* data)
174 {
175         /* Take necessary actions when application becomes visible. */
176         dlog_print(DLOG_DEBUG, LOG_TAG, "### app_resume ###");
177 }
178
179 static void app_terminate(void* data)
180 {
181         /* unregister vconf notify callback */
182         int ret;
183         appdata_s* ad = (appdata_s*)data;
184
185         switch (ad->view_type) {
186         case ENCRYPT_DEVICE:
187                 ret = vconf_ignore_key_changed(VCONFKEY_SETAPPL_SCREEN_LOCK_TYPE_INT, locktype_status_changed_cb);
188                 if (ret != 0)
189                         dlog_print(DLOG_ERROR, LOG_TAG, "Failed to unregister lockscreen type callback");
190                 /* unregister runtime info callback */
191                 ret = runtime_info_unset_changed_cb(RUNTIME_INFO_KEY_CHARGER_CONNECTED);
192                 if (ret != 0)
193                         dlog_print(DLOG_ERROR, LOG_TAG, "Failed to unregister runtime info callback");
194                 /* unregister battery percent callback */
195                 ret = device_remove_callback(DEVICE_CALLBACK_BATTERY_CAPACITY, battery_changed_cb);
196                 if (ret != 0)
197                         dlog_print(DLOG_ERROR, LOG_TAG, "Failed to unregister battery capacity callback");
198                 break;
199         case DECRYPT_DEVICE:
200                 /* unregister runtime info callback */
201                 ret = runtime_info_unset_changed_cb(RUNTIME_INFO_KEY_CHARGER_CONNECTED);
202                 if (ret != 0)
203                         dlog_print(DLOG_ERROR, LOG_TAG, "Failed to unregister runtime info callback");
204                 /* unregister battery percent callback */
205                 ret = device_remove_callback(DEVICE_CALLBACK_BATTERY_CAPACITY, battery_changed_cb);
206                 if (ret != 0)
207                         dlog_print(DLOG_ERROR, LOG_TAG, "Failed to unregister battery capacity callback");
208                 break;
209         case ENCRYPT_SD_CARD:
210                 ret = vconf_ignore_key_changed(VCONFKEY_SYSMAN_MMC_STATUS, sdcard_status_changed_cb);
211                 if (ret != 0)
212                         dlog_print(DLOG_ERROR, LOG_TAG, "Failed to unregister sdcard callback");
213                 break;
214         }
215 }
216
217 static void ui_app_lang_changed(app_event_info_h event_info, void* user_data)
218 {
219         /* APP_EVENT_LANGUAGE_CHANGED */
220         char* locale = NULL;
221
222         system_settings_get_value_string(SYSTEM_SETTINGS_KEY_LOCALE_LANGUAGE, &locale);
223         elm_language_set(locale);
224         free(locale);
225
226         return;
227 }
228
229 static void ui_app_orient_changed(app_event_info_h event_info, void* user_data)
230 {
231         /*APP_EVENT_DEVICE_ORIENTATION_CHANGED */
232         return;
233 }
234
235 static void ui_app_region_changed(app_event_info_h event_info, void* user_data)
236 {
237         /*APP_EVENT_REGION_FORMAT_CHANGED */
238 }
239
240 static void ui_app_low_battery(app_event_info_h event_info, void* user_data)
241 {
242         /*APP_EVENT_LOW_BATTERY */
243 }
244
245 static void ui_app_low_memory(app_event_info_h event_info, void* user_data)
246 {
247         /*APP_EVENT_LOW_MEMORY */
248 }
249
250 int launchpad_main(int argc, char* argv[])
251 {
252         appdata_s ad = {0, };
253         int ret = 0;
254
255         ui_app_lifecycle_callback_s event_callback = { 0, };
256         app_event_handler_h handlers[5] = { NULL, };
257
258         event_callback.create = app_create;
259         event_callback.terminate = app_terminate;
260         event_callback.pause = app_pause;
261         event_callback.resume = app_resume;
262         event_callback.app_control = app_control;
263
264         ui_app_add_event_handler(&handlers[APP_EVENT_LOW_BATTERY], APP_EVENT_LOW_BATTERY, ui_app_low_battery, &ad);
265         ui_app_add_event_handler(&handlers[APP_EVENT_LOW_MEMORY], APP_EVENT_LOW_MEMORY, ui_app_low_memory, &ad);
266         ui_app_add_event_handler(&handlers[APP_EVENT_DEVICE_ORIENTATION_CHANGED], APP_EVENT_DEVICE_ORIENTATION_CHANGED, ui_app_orient_changed, &ad);
267         ui_app_add_event_handler(&handlers[APP_EVENT_LANGUAGE_CHANGED], APP_EVENT_LANGUAGE_CHANGED, ui_app_lang_changed, &ad);
268         ui_app_add_event_handler(&handlers[APP_EVENT_REGION_FORMAT_CHANGED], APP_EVENT_REGION_FORMAT_CHANGED, ui_app_region_changed, &ad);
269         ui_app_remove_event_handler(handlers[APP_EVENT_LOW_MEMORY]);
270
271         ret = ui_app_main(argc, argv, &event_callback, &ad);
272         if (ret != APP_ERROR_NONE)
273                 dlog_print(DLOG_ERROR, LOG_TAG, "ui_app_main is failed. err = %d", ret);
274         return ret;
275
276 }
277
278 int standalone_main(int argc, char *argv[])
279 {
280         setenv("HOME", "/root", 1);
281
282         if (argc <2) {
283                 fprintf(stderr, "Other arguments is needed\n");
284                 return EXIT_FAILURE;
285         }
286
287         elm_init(argc, argv);
288         ui_app_lang_changed(NULL, NULL);
289         create_base_window();
290
291         if (!strncmp(argv[1], "progress", sizeof("progress"))) {
292                 if (argc < 4) {
293                         fprintf(stderr, "Other arguments is needed\n");
294                         return EXIT_FAILURE;
295                 }
296                 create_progress_view(argv[2], argv[3]);
297         }
298
299         elm_run();
300
301         return EXIT_SUCCESS;
302 }
303
304 int main(int argc, char* argv[])
305 {
306         char *name = strrchr(argv[0], '/');
307         int i;
308
309         name = name ? name + 1 : argv[0];
310
311         for (i = 0; i < sizeof(submains) / sizeof(struct submain); i++) {
312                 if (strcmp(name, submains[i].name) == 0) {
313                     return submains[i].main(argc, argv);
314                 }
315         }
316
317         return EXIT_FAILURE;
318 }