2 * Copyright (c) 2011 - 2016 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.
25 #include <aul_window.h>
27 #include <cynara-client.h>
28 #include <package-manager.h>
30 #include "app_manager.h"
31 #include "app_manager_internal.h"
37 #define LOG_TAG "CAPI_APPFW_APP_MANAGER"
39 #define SMACK_LABEL_LEN 255
41 static const char *app_manager_error_to_string(app_manager_error_e error)
44 case APP_MANAGER_ERROR_NONE:
46 case APP_MANAGER_ERROR_INVALID_PARAMETER:
47 return "Invalid parameter";
48 case APP_MANAGER_ERROR_OUT_OF_MEMORY:
49 return "Out of memory";
50 case APP_MANAGER_ERROR_IO_ERROR:
52 case APP_MANAGER_ERROR_NO_SUCH_APP:
53 return "No such application";
54 case APP_MANAGER_ERROR_DB_FAILED:
56 case APP_MANAGER_ERROR_INVALID_PACKAGE:
57 return "Invalid package";
58 case APP_MANAGER_ERROR_NOT_SUPPORTED:
59 return "Not supported";
60 case APP_MANAGER_ERROR_PERMISSION_DENIED:
61 return "Permission denied";
67 int app_manager_error(app_manager_error_e error, const char *function, const char *description)
70 LOGE("[%s] %s(0x%08x) : %s", function, app_manager_error_to_string(error), error, description);
72 LOGE("[%s] %s(0x%08x)", function, app_manager_error_to_string(error), error);
77 API int app_manager_set_app_context_event_cb(app_manager_app_context_event_cb callback, void *user_data)
81 retval = app_context_set_event_cb(callback, user_data);
82 if (retval != APP_MANAGER_ERROR_NONE)
83 return app_manager_error(retval, __FUNCTION__, NULL);
85 return APP_MANAGER_ERROR_NONE;
88 API void app_manager_unset_app_context_event_cb(void)
90 app_context_unset_event_cb();
93 API int app_manager_foreach_app_context(app_manager_app_context_cb callback, void *user_data)
97 retval = app_context_foreach_app_context(callback, user_data);
98 if (retval != APP_MANAGER_ERROR_NONE)
99 return app_manager_error(retval, __FUNCTION__, NULL);
101 return APP_MANAGER_ERROR_NONE;
104 API int app_manager_foreach_running_app_context(app_manager_app_context_cb callback, void *user_data)
108 retval = app_context_foreach_running_app_context(callback, user_data);
109 if (retval != APP_MANAGER_ERROR_NONE)
110 return app_manager_error(retval, __FUNCTION__, NULL);
112 return APP_MANAGER_ERROR_NONE;
115 API int app_manager_get_app_context(const char *app_id, app_context_h *app_context)
119 retval = app_context_get_app_context(app_id, app_context);
120 if (retval != APP_MANAGER_ERROR_NONE)
121 return app_manager_error(retval, __FUNCTION__, NULL);
123 return APP_MANAGER_ERROR_NONE;
126 API int app_manager_resume_app(app_context_h app_context)
129 char *instance_id = NULL;
130 int retval = APP_MANAGER_ERROR_NONE;
132 if (app_context == NULL)
133 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
135 if (app_context_get_app_id(app_context, &app_id) != APP_MANAGER_ERROR_NONE)
136 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, "failed to get the application ID");
138 app_context_get_instance_id(app_context, &instance_id);
140 retval = aul_resume_app_by_instance_id(app_id, instance_id);
143 if (aul_app_is_running(app_id) == 0) {
148 return app_manager_error(APP_MANAGER_ERROR_APP_NO_RUNNING, __FUNCTION__, NULL);
151 retval = aul_resume_app(app_id);
157 if (retval == AUL_R_EINVAL)
158 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
159 else if (retval == AUL_R_EILLACC)
160 return app_manager_error(APP_MANAGER_ERROR_PERMISSION_DENIED, __FUNCTION__, NULL);
162 return app_manager_error(APP_MANAGER_ERROR_REQUEST_FAILED, __FUNCTION__, NULL);
164 return APP_MANAGER_ERROR_NONE;
167 API int app_manager_foreach_app_info(app_manager_app_info_cb callback, void *user_data)
171 retval = app_info_foreach_app_info(callback, user_data);
172 if (retval != APP_MANAGER_ERROR_NONE)
173 return app_manager_error(retval, __FUNCTION__, NULL);
175 return APP_MANAGER_ERROR_NONE;
178 API int app_manager_get_app_info(const char *app_id, app_info_h *app_info)
182 retval = app_info_create(app_id, app_info);
183 if (retval != APP_MANAGER_ERROR_NONE)
184 return app_manager_error(retval, __FUNCTION__, NULL);
186 return APP_MANAGER_ERROR_NONE;
189 API int app_manager_get_app_id(pid_t pid, char **app_id)
191 char buffer[256] = {0, };
192 char *app_id_dup = NULL;
195 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
197 if (aul_app_get_appid_bypid(pid, buffer, sizeof(buffer)) != AUL_R_OK)
198 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, "Invalid process ID");
200 app_id_dup = strdup(buffer);
201 if (app_id_dup == NULL)
202 return app_manager_error(APP_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL); /* LCOV_EXCL_LINE */
204 *app_id = app_id_dup;
206 return APP_MANAGER_ERROR_NONE;
209 API int app_manager_terminate_app(app_context_h app_context)
214 if (app_context == NULL)
215 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
217 if (app_context_get_pid(app_context, &pid) != APP_MANAGER_ERROR_NONE)
218 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, "failed to get the process ID");
220 retval = aul_terminate_pid(pid);
221 if (retval == AUL_R_EINVAL) {
222 LOGE("[%s] APP_MANAGER_ERROR_INVALID_PARAMETER(0x%08x) : Invalid param", __FUNCTION__, APP_MANAGER_ERROR_INVALID_PARAMETER);
223 return APP_MANAGER_ERROR_INVALID_PARAMETER;
224 } else if (retval == AUL_R_EILLACC) {
225 LOGE("[%s] APP_MANAGER_ERROR_PERMISSION_DENIED(0x%08x) : Permission denied", __FUNCTION__, APP_MANAGER_ERROR_PERMISSION_DENIED);
226 return APP_MANAGER_ERROR_PERMISSION_DENIED;
227 } else if (retval < 0) {
228 return APP_MANAGER_ERROR_REQUEST_FAILED;
231 return APP_MANAGER_ERROR_NONE;
234 API int app_manager_request_terminate_bg_app(app_context_h app_context)
236 int retval = APP_MANAGER_ERROR_NONE;
239 if (app_context == NULL)
240 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
242 if (app_context_get_pid(app_context, &pid) != APP_MANAGER_ERROR_NONE)
243 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, "failed to get the process ID");
245 retval = aul_terminate_bgapp_pid(pid);
246 if (retval == AUL_R_EINVAL) {
247 LOGE("[%s] APP_MANAGER_ERROR_INVALID_PARAMETER(0x%08x) : Invalid param", __FUNCTION__, APP_MANAGER_ERROR_INVALID_PARAMETER);
248 return APP_MANAGER_ERROR_INVALID_PARAMETER;
249 } else if (retval == AUL_R_EILLACC) {
250 LOGE("[%s] APP_MANAGER_ERROR_PERMISSION_DENIED(0x%08x) : Permission denied", __FUNCTION__, APP_MANAGER_ERROR_PERMISSION_DENIED);
251 return APP_MANAGER_ERROR_PERMISSION_DENIED;
252 } else if (retval < 0) {
253 return APP_MANAGER_ERROR_REQUEST_FAILED;
256 return APP_MANAGER_ERROR_NONE;
259 API int app_manager_is_running(const char *app_id, bool *running)
261 if (app_id == NULL) {
262 LOGE("[%s] INVALID_PARAMETER(0x%08x) : invalid package", __FUNCTION__, APP_MANAGER_ERROR_INVALID_PARAMETER);
263 return APP_MANAGER_ERROR_INVALID_PARAMETER;
266 if (running == NULL) {
267 LOGE("[%s] INVALID_PARAMETER(0x%08x) : invalid output param", __FUNCTION__, APP_MANAGER_ERROR_INVALID_PARAMETER);
268 return APP_MANAGER_ERROR_INVALID_PARAMETER;
271 *running = aul_app_is_running(app_id);
273 return APP_MANAGER_ERROR_NONE;
276 API int app_manager_get_shared_data_path(const char *app_id, char **path)
281 if (app_id == NULL || path == NULL)
282 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
284 retval = aul_get_app_shared_data_path_by_appid(app_id, path);
287 r = APP_MANAGER_ERROR_NONE;
290 r = app_manager_error(APP_MANAGER_ERROR_NO_SUCH_APP, __FUNCTION__, NULL);
293 r = app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
296 r = app_manager_error(APP_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
298 case AUL_R_EREJECTED:
299 r = app_manager_error(APP_MANAGER_ERROR_NOT_SUPPORTED, __FUNCTION__, NULL);
302 r = app_manager_error(APP_MANAGER_ERROR_REQUEST_FAILED, __FUNCTION__, NULL);
309 API int app_manager_get_shared_resource_path(const char *app_id, char **path)
312 int retval = aul_get_app_shared_resource_path_by_appid(app_id, path);
316 r = APP_MANAGER_ERROR_NONE;
319 r = app_manager_error(APP_MANAGER_ERROR_NO_SUCH_APP, __FUNCTION__, NULL);
322 r = app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
325 r = app_manager_error(APP_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
328 r = app_manager_error(APP_MANAGER_ERROR_REQUEST_FAILED, __FUNCTION__, NULL);
335 API int app_manager_get_shared_trusted_path(const char *app_id, char **path)
338 int retval = aul_get_app_shared_trusted_path_by_appid(app_id, path);
342 r = APP_MANAGER_ERROR_NONE;
345 r = app_manager_error(APP_MANAGER_ERROR_NO_SUCH_APP, __FUNCTION__, NULL);
348 r = app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
351 r = app_manager_error(APP_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
354 r = app_manager_error(APP_MANAGER_ERROR_REQUEST_FAILED, __FUNCTION__, NULL);
361 API int app_manager_get_external_shared_data_path(const char *app_id, char **path)
363 dlog_print(DLOG_WARN, LOG_TAG, "DEPRECATION WARNING: app_manager_get_external_shared_data_path() is deprecated and will be removed from next release.");
365 int retval = aul_get_app_external_shared_data_path_by_appid(app_id, path);
369 r = APP_MANAGER_ERROR_NONE;
372 r = app_manager_error(APP_MANAGER_ERROR_NO_SUCH_APP, __FUNCTION__, NULL);
375 r = app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
378 r = app_manager_error(APP_MANAGER_ERROR_OUT_OF_MEMORY, __FUNCTION__, NULL);
381 r = app_manager_error(APP_MANAGER_ERROR_REQUEST_FAILED, __FUNCTION__, NULL);
388 API int app_manager_set_splash_screen_display(const char *app_id, bool display)
394 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER,
397 pc = pkgmgr_client_new(PC_REQUEST);
399 return app_manager_error(APP_MANAGER_ERROR_OUT_OF_MEMORY,
403 r = pkgmgr_client_enable_splash_screen(pc, app_id);
405 r = pkgmgr_client_disable_splash_screen(pc, app_id);
406 pkgmgr_client_free(pc);
410 r = APP_MANAGER_ERROR_NONE;
412 case PKGMGR_R_EINVAL:
413 r = app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER,
417 r = app_manager_error(APP_MANAGER_ERROR_PERMISSION_DENIED,
420 case PKGMGR_R_ENOMEM:
421 r = app_manager_error(APP_MANAGER_ERROR_OUT_OF_MEMORY,
425 r = app_manager_error(APP_MANAGER_ERROR_IO_ERROR,
433 API int app_manager_set_app_icon(const char *app_id, const char *icon_path)
439 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER,
442 pc = pkgmgr_client_new(PC_REQUEST);
444 return app_manager_error(APP_MANAGER_ERROR_OUT_OF_MEMORY,
447 r = pkgmgr_client_set_app_icon(pc, (char *)app_id, (char *)icon_path);
448 pkgmgr_client_free(pc);
452 r = APP_MANAGER_ERROR_NONE;
454 case PKGMGR_R_EINVAL:
455 r = app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER,
459 r = app_manager_error(APP_MANAGER_ERROR_PERMISSION_DENIED,
463 r = app_manager_error(APP_MANAGER_ERROR_IO_ERROR,
472 API int app_manager_event_create(app_manager_event_h *handle)
474 pkgmgr_client *pc = NULL;
475 app_manager_event *app_mgr_evt = NULL;
478 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER,
481 app_mgr_evt = (app_manager_event *)calloc(1, sizeof(app_manager_event));
482 if (app_mgr_evt == NULL) {
483 /* LCOV_EXCL_START */
484 return app_manager_error(APP_MANAGER_ERROR_OUT_OF_MEMORY,
489 pc = pkgmgr_client_new(PC_LISTENING);
491 /* LCOV_EXCL_START */
493 return app_manager_error(APP_MANAGER_ERROR_OUT_OF_MEMORY,
498 app_mgr_evt->pc = pc;
499 *handle = app_mgr_evt;
500 return APP_MANAGER_ERROR_NONE;
503 API int app_manager_event_set_status(app_manager_event_h handle, int status_type)
505 int ret = APP_MANAGER_ERROR_NONE;
506 int pkgmgr_status_type = -1;
508 if (handle == NULL || status_type < 0)
509 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER,
512 pkgmgr_status_type = convert_status_type(status_type);
513 if (pkgmgr_status_type < 0)
514 return app_manager_error(APP_MANAGER_ERROR_REQUEST_FAILED,
517 ret = pkgmgr_client_set_status_type(handle->pc, pkgmgr_status_type);
518 if (ret != PKGMGR_R_OK) {
519 /* LCOV_EXCL_START */
520 LOGE("[%s] APP_MANAGER_ERROR_REQUEST_FAILED(0x%08x) : " \
521 "Failed to set event status", __FUNCTION__,
522 APP_MANAGER_ERROR_REQUEST_FAILED);
523 return APP_MANAGER_ERROR_REQUEST_FAILED;
527 return APP_MANAGER_ERROR_NONE;
530 API int app_manager_set_event_cb(app_manager_event_h handle,
531 app_manager_event_cb callback,
534 int ret = APP_MANAGER_ERROR_NONE;
536 if (handle == NULL || callback == NULL)
537 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER,
540 handle->event_cb = callback;
541 handle->user_data = user_data;
543 ret = pkgmgr_client_listen_app_status(handle->pc,
544 app_event_handler, handle);
545 if (ret < PKGMGR_R_OK) {
546 /* LCOV_EXCL_START */
547 LOGE("[%s] APP_MANAGER_ERROR_REQUEST_FAILED(0x%08x) : " \
548 "Failed to set event callback", __FUNCTION__,
549 APP_MANAGER_ERROR_REQUEST_FAILED);
550 return APP_MANAGER_ERROR_REQUEST_FAILED;
554 handle->req_id = ret;
555 return APP_MANAGER_ERROR_NONE;
558 API int app_manager_unset_event_cb(app_manager_event_h handle)
560 int ret = APP_MANAGER_ERROR_NONE;
562 if (handle == NULL || handle->pc == NULL)
563 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER,
566 ret = pkgmgr_client_remove_listen_status(handle->pc);
568 /* LCOV_EXCL_START */
569 LOGE("[%s] APP_MANAGER_ERROR_REQUEST_FAILED(0x%08x) : " \
570 "Failed to unset event callback", __FUNCTION__,
571 APP_MANAGER_ERROR_REQUEST_FAILED);
572 return APP_MANAGER_ERROR_REQUEST_FAILED;
576 return APP_MANAGER_ERROR_NONE;
579 API int app_manager_event_destroy(app_manager_event_h handle)
581 int ret = APP_MANAGER_ERROR_NONE;
584 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER,
587 ret = pkgmgr_client_free(handle->pc);
589 /* LCOV_EXCL_START */
590 LOGE("[%s] APP_MANAGER_ERROR_REQUEST_FAILED(0x%08x) : " \
591 "Failed to destroy handle", __FUNCTION__,
592 APP_MANAGER_ERROR_REQUEST_FAILED);
593 return APP_MANAGER_ERROR_REQUEST_FAILED;
596 remove_app_manager_event_info_list(handle->head);
599 return APP_MANAGER_ERROR_NONE;
602 API int app_manager_set_app_context_status_cb(app_manager_app_context_status_cb callback, const char *appid, void *user_data)
606 ret = app_context_set_status_cb(callback, appid, user_data);
607 if (ret != APP_MANAGER_ERROR_NONE)
608 return app_manager_error(ret, __FUNCTION__, NULL);
610 return APP_MANAGER_ERROR_NONE;
613 API int app_manager_get_app_context_by_instance_id(const char *app_id, const char *instance_id, app_context_h *app_context)
617 ret = app_context_get_app_context_by_instance_id(app_id, instance_id, app_context);
618 if (ret != APP_MANAGER_ERROR_NONE)
619 return app_manager_error(ret, __FUNCTION__, NULL);
621 return APP_MANAGER_ERROR_NONE;
624 API int app_manager_get_focused_app_context(app_context_h *app_context)
629 if (app_context == NULL)
630 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
632 ret = aul_window_get_focused_pid(&pid);
634 return app_manager_error(APP_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL); /* LCOV_EXCL_LINE */
637 return app_manager_error(APP_MANAGER_ERROR_NO_SUCH_APP, __FUNCTION__, NULL);
639 ret = app_context_get_app_context_by_pid(pid, app_context);
640 if (ret != APP_MANAGER_ERROR_NONE)
641 return app_manager_error(ret, __FUNCTION__, NULL); /* LCOV_EXCL_LINE */
643 return APP_MANAGER_ERROR_NONE;
646 API int app_manager_attach_window(const char *parent_app_id, const char *child_app_id)
650 if (parent_app_id == NULL || child_app_id == NULL)
651 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
653 ret = aul_window_attach(parent_app_id, child_app_id);
655 return app_manager_error(APP_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
657 return APP_MANAGER_ERROR_NONE;
660 API int app_manager_detach_window(const char *app_id)
665 return app_manager_error(APP_MANAGER_ERROR_INVALID_PARAMETER, __FUNCTION__, NULL);
667 ret = aul_window_detach(app_id);
669 return app_manager_error(APP_MANAGER_ERROR_IO_ERROR, __FUNCTION__, NULL);
671 return APP_MANAGER_ERROR_NONE;
674 API int app_manager_unset_app_context_status_cb(app_manager_app_context_status_cb callback, const char *appid)
678 ret = app_context_unset_status_cb(callback, appid);
679 if (ret != APP_MANAGER_ERROR_NONE)
680 return app_manager_error(ret, __FUNCTION__, NULL);
682 return APP_MANAGER_ERROR_NONE;
685 API int app_manager_foreach_visible_app_context(app_manager_app_context_cb callback, void *user_data)
689 ret = app_context_foreach_visible_app_context(callback, user_data);
690 if (ret != APP_MANAGER_ERROR_NONE)
691 return app_manager_error(ret, __FUNCTION__, NULL);
693 return APP_MANAGER_ERROR_NONE;