2 * Copyright (c) 2000 - 2015 Samsung Electronics Co., Ltd. All rights reserved.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 #include <Elementary.h>
20 #include <sys/types.h>
33 #include "lock_pwd_util.h"
34 #include "lock_pwd_control_panel.h"
37 #include "process_mgr.h"
42 #define PWLOCK_LITE_PKG_NAME "org.tizen.pwlock-lite"
44 #define DATA_UNENCRYPTED "unencrypted"
45 #define DATA_MOUNTED "mounted"
46 #define SD_DATA_ENCRYPTED "encrypted"
47 #define SD_CRYPT_META_FILE ".MetaEcfsFile"
48 #define MMC_MOUNT_POINT "/opt/storage/sdcard"
52 static void _hide_home(void)
54 int seq = status_active_get()->starter_sequence;
57 vconf_set_int(VCONFKEY_STARTER_SEQUENCE, 0);
62 static void _show_home(void)
64 vconf_set_int(VCONFKEY_STARTER_SEQUENCE, 1);
70 static Eina_Bool _finish_boot_animation(void *data)
72 if (vconf_set_int(VCONFKEY_BOOT_ANIMATION_FINISHED, 1) != 0) {
73 _E("Failed to set boot animation finished set");
77 return ECORE_CALLBACK_CANCEL;
82 static int _fail_to_launch_pwlock(const char *appid, const char *key, const char *value, void *cfn, void *afn)
84 _finish_boot_animation(NULL);
90 static void _after_launch_pwlock(int pid)
92 process_mgr_set_pwlock_priority(pid);
93 ecore_timer_add(0.5, _finish_boot_animation, NULL);
99 static void _signal_handler(int signum, siginfo_t *info, void *unused)
101 _D("_signal_handler : Terminated...");
107 static int _power_off_cb(status_active_key_e key, void *data)
109 int val = status_active_get()->sysman_power_off_status;
111 if (val == VCONFKEY_SYSMAN_POWER_OFF_DIRECT
112 || val == VCONFKEY_SYSMAN_POWER_OFF_RESTART)
114 _D("_power_off_cb : Terminated...");
123 static int _boot_animation_finished_cb(status_active_key_e key, void *data)
125 int val = status_active_get()->boot_animation_finished;
126 _D("boot animation finished : %d", val);
129 lock_mgr_daemon_start();
138 static void _language_changed_cb(keynode_t *node, void *data)
144 lang = vconf_keynode_get_str(node);
147 _D("language is changed : %s", lang);
149 elm_language_set(lang);
151 lock_pwd_util_view_init();
152 lock_pwd_control_panel_emg_btn_text_update();
157 static int _set_i18n(const char *domain, const char *dir)
161 if (domain == NULL) {
166 char *lang = vconf_get_str(VCONFKEY_LANGSET);
167 r = setlocale(LC_ALL, lang);
169 _E("setlocale() error");
175 r = bindtextdomain(domain, dir);
177 _E("bindtextdomain() error");
180 r = textdomain(domain);
182 _E("textdomain() error");
185 if (vconf_notify_key_changed(VCONFKEY_LANGSET, _language_changed_cb, NULL) < 0) {
186 _E("Failed to register changed cb : %s", VCONFKEY_LANGSET);
194 static int _check_dead_signal(int pid, void *data)
196 #ifndef TIZEN_BUILD_TARGET_64
199 int indicator_pid = 0;
200 int quickpanel_pid = 0;
203 _D("Process %d is termianted", pid);
211 * If the architecture is not 64bit,
212 * starter try to re-launch these apps when the app is dead.
214 home_pid = home_mgr_get_home_pid();
215 volume_pid = home_mgr_get_volume_pid();
216 indicator_pid = home_mgr_get_indicator_pid();
217 quickpanel_pid = home_mgr_get_quickpanel_pid();
218 lock_pid = lock_mgr_get_lock_pid();
220 if (pid == home_pid) {
221 _D("Homescreen is dead");
222 home_mgr_relaunch_homescreen();
223 } else if (pid == volume_pid) {
224 _D("volume is dead");
225 home_mgr_relaunch_volume();
226 } else if (pid == indicator_pid) {
227 _D("indicator is dead");
228 home_mgr_relaunch_indicator();
229 } else if (pid == quickpanel_pid) {
230 _D("quickpanel is dead");
231 home_mgr_relaunch_quickpanel();
232 } else if (pid == lock_pid) {
233 _D("lockscreen is dead");
236 _D("Unknown process, ignore it");
239 _D("Process %d is termianted", pid);
252 static void _init(struct appdata *ad)
254 struct sigaction act;
255 char err_buf[128] = {0,};
257 memset(&act,0x00,sizeof(struct sigaction));
258 act.sa_sigaction = _signal_handler;
259 act.sa_flags = SA_SIGINFO;
261 int ret = sigemptyset(&act.sa_mask);
263 if (strerror_r(errno, err_buf, sizeof(err_buf)) == 0) {
264 _E("Failed to sigemptyset[%d / %s]", errno, err_buf);
267 ret = sigaddset(&act.sa_mask, SIGTERM);
269 if (strerror_r(errno, err_buf, sizeof(err_buf)) == 0) {
270 _E("Failed to sigaddset[%d / %s]", errno, err_buf);
273 ret = sigaction(SIGTERM, &act, NULL);
275 if (strerror_r(errno, err_buf, sizeof(err_buf)) == 0) {
276 _E("Failed to sigaction[%d / %s]", errno, err_buf);
280 _set_i18n(PACKAGE, LOCALEDIR);
283 status_active_register_cb(STATUS_ACTIVE_KEY_SYSMAN_POWER_OFF_STATUS, _power_off_cb, NULL);
285 #ifndef TIZEN_BUILD_TARGET_64
287 * If 'VCONFKEY_BOOT_ANIMATION_FINISHED' is already 1,
288 * it is not necessary to register vconfkey callback function.
290 if (status_active_get()->boot_animation_finished == 1) {
291 lock_mgr_daemon_start();
294 /* Ordering : _hide_home -> process_mgr_must_launch(pwlock) -> _show_home */
297 process_mgr_must_launch(PWLOCK_LITE_PKG_NAME, NULL, NULL, _fail_to_launch_pwlock, _after_launch_pwlock);
300 status_active_register_cb(STATUS_ACTIVE_KEY_BOOT_ANIMATION_FINISHED, _boot_animation_finished_cb, NULL);
304 hw_key_create_window();
307 aul_listen_app_dead_signal(_check_dead_signal, NULL);
312 static void _fini(struct appdata *ad)
315 hw_key_destroy_window();
316 lock_mgr_daemon_end();
318 status_active_unregister_cb(STATUS_ACTIVE_KEY_SYSMAN_POWER_OFF_STATUS, _power_off_cb);
319 status_active_unregister_cb(STATUS_ACTIVE_KEY_BOOT_ANIMATION_FINISHED, _boot_animation_finished_cb);
322 if (vconf_ignore_key_changed(VCONFKEY_LANGSET, _language_changed_cb) < 0) {
323 _E("Failed to unregister changed cb : %s", VCONFKEY_LANGSET);
329 int main(int argc, char *argv[])
333 _D("starter is launched..!!");
335 elm_init(argc, argv);