2 * Copyright (c) 2016 Samsung Electronics Co., Ltd.
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.
21 #include <syspopup_caller.h>
23 #include <bundle_internal.h>
27 #include "stc-plugin-iface-appstatus.h"
30 #define AUL_APP_STATUS_DBUS_PATH "/Org/Tizen/Aul/AppStatus"
31 #define AUL_APP_STATUS_DBUS_SIGNAL_INTERFACE "org.tizen.aul.AppStatus"
32 #define AUL_APP_STATUS_BUS_NAME AUL_APP_STATUS_DBUS_SIGNAL_INTERFACE
34 #define AUL_APP_STATUS_DBUS_LAUNCH_REQUEST "AppLaunch"
35 #define AUL_APP_STATUS_DBUS_LAUNCH_REQUEST_TYPE "(isss)"
36 #define AUL_APP_STATUS_DBUS_TERMINATE_REQUEST "AppTerminate"
37 #define AUL_APP_STATUS_DBUS_TERMINATE_REQUEST_TYPE "(isss)"
38 #define AUL_APP_STATUS_DBUS_STATUS_CHANGE "AppStatusChange"
39 #define AUL_APP_STATUS_DBUS_STATUS_CHANGE_TYPE "(issss)"
44 const gchar *interface;
46 const gchar *param_type;
47 GDBusSignalCallback callback;
51 stc_error_e(*state_changed_cb)(stc_cmd_type_e cmd, pid_t pid,
52 const gchar *app_id, const gchar *pkg_id,
53 stc_app_type_e app_type);
55 static void __stc_gdbus_handle_aul_changestate(GDBusConnection *connection,
56 const gchar *sender_name,
57 const gchar *object_path,
58 const gchar *interface_name,
59 const gchar *signal_name,
64 stc_cmd_type_e status;
65 stc_app_type_e apptype;
68 gchar *statstr = NULL;
69 gchar *pkgtype = NULL;
71 if (g_strcmp0(signal_name, AUL_APP_STATUS_DBUS_LAUNCH_REQUEST) == 0) {
72 if (g_strcmp0(g_variant_get_type_string(parameters),
73 AUL_APP_STATUS_DBUS_LAUNCH_REQUEST_TYPE)) {
74 STC_LOGE("Dbus type not matching, do not process");
78 g_variant_get(parameters, AUL_APP_STATUS_DBUS_LAUNCH_REQUEST_TYPE,
79 &pid, &appid, &pkgid, &pkgtype);
81 status = STC_CMD_SET_APP_LAUNCHED;
83 if (!strncmp(pkgtype, "svc", 3))
84 apptype = STC_APP_TYPE_SERVICE;
85 else if (!strncmp(pkgtype, "widget", 6))
86 apptype = STC_APP_TYPE_WIDGET;
87 else if (!strncmp(pkgtype, "watch", 5))
88 apptype = STC_APP_TYPE_WATCH;
90 apptype = STC_APP_TYPE_GUI;
93 STC_LOGD("APP STATUS[\033[1;34mlaunch\033[0;m] PkgID[\033[0;34m%s\033[0;m] "
94 "AppID[\033[0;32m%s\033[0;m] PID[\033[1;33m%d\033[0;m] Type[%s]",
95 pkgid, appid, pid, pkgtype);
99 state_changed_cb(status, pid, appid, pkgid, apptype);
100 } else if (g_strcmp0(signal_name, AUL_APP_STATUS_DBUS_TERMINATE_REQUEST) == 0) {
101 if (g_strcmp0(g_variant_get_type_string(parameters),
102 AUL_APP_STATUS_DBUS_TERMINATE_REQUEST_TYPE)) {
103 STC_LOGE("Dbus type not matching, do not process");
107 g_variant_get(parameters, AUL_APP_STATUS_DBUS_TERMINATE_REQUEST_TYPE,
108 &pid, &appid, &pkgid, &pkgtype);
110 status = STC_CMD_SET_TERMINATED;
112 if (!strncmp(pkgtype, "svc", 3))
113 apptype = STC_APP_TYPE_SERVICE;
114 else if (!strncmp(pkgtype, "widget", 6))
115 apptype = STC_APP_TYPE_WIDGET;
116 else if (!strncmp(pkgtype, "watch", 5))
117 apptype = STC_APP_TYPE_WATCH;
119 apptype = STC_APP_TYPE_GUI;
122 STC_LOGD("APP STATUS[\033[1;34mterminate\033[0;m] PkgID[\033[0;34m%s\033[0;m] "
123 "AppID[\033[0;32m%s\033[0;m] PID[\033[1;33m%d\033[0;m] Type[%s]",
124 pkgid, appid, pid, pkgtype);
127 if (state_changed_cb)
128 state_changed_cb(status, pid, appid, pkgid, apptype);
129 } else if (g_strcmp0(signal_name, AUL_APP_STATUS_DBUS_STATUS_CHANGE) == 0) {
130 if (g_strcmp0(g_variant_get_type_string(parameters),
131 AUL_APP_STATUS_DBUS_STATUS_CHANGE_TYPE)) {
132 STC_LOGE("Dbus type not matching, do not process");
136 g_variant_get(parameters, AUL_APP_STATUS_DBUS_STATUS_CHANGE_TYPE,
137 &pid, &appid, &pkgid, &statstr, &pkgtype);
139 if (!strncmp(statstr, "fg", 2)) {
140 status = STC_CMD_SET_FOREGRD;
141 } else if (!strncmp(statstr, "bg", 2)) {
142 status = STC_CMD_SET_BACKGRD;
147 if (!strncmp(pkgtype, "svc", 3))
148 apptype = STC_APP_TYPE_SERVICE;
149 else if (!strncmp(pkgtype, "widget", 6))
150 apptype = STC_APP_TYPE_WIDGET;
151 else if (!strncmp(pkgtype, "watch", 5))
152 apptype = STC_APP_TYPE_WATCH;
154 apptype = STC_APP_TYPE_GUI;
157 STC_LOGD("APP STATUS[\033[1;34m%s\033[0;m] PkgID[\033[0;34m%s\033[0;m] "
158 "AppID[\033[0;32m%s\033[0;m] PID[\033[1;33m%d\033[0;m] Type[%s]",
159 (status == STC_CMD_SET_FOREGRD) ? "Foregrd" : "Backgrd", pkgid, appid, pid, pkgtype);
162 if (state_changed_cb)
163 state_changed_cb(status, pid, appid, pkgid, apptype);
173 static signal_map_s signal_map[] = {
178 AUL_APP_STATUS_DBUS_PATH,
179 AUL_APP_STATUS_DBUS_SIGNAL_INTERFACE,
180 AUL_APP_STATUS_DBUS_LAUNCH_REQUEST,
181 AUL_APP_STATUS_DBUS_LAUNCH_REQUEST_TYPE,
182 __stc_gdbus_handle_aul_changestate,
187 AUL_APP_STATUS_DBUS_PATH,
188 AUL_APP_STATUS_DBUS_SIGNAL_INTERFACE,
189 AUL_APP_STATUS_DBUS_TERMINATE_REQUEST,
190 AUL_APP_STATUS_DBUS_TERMINATE_REQUEST_TYPE,
191 __stc_gdbus_handle_aul_changestate,
196 AUL_APP_STATUS_DBUS_PATH,
197 AUL_APP_STATUS_DBUS_SIGNAL_INTERFACE,
198 AUL_APP_STATUS_DBUS_STATUS_CHANGE,
199 AUL_APP_STATUS_DBUS_STATUS_CHANGE_TYPE,
200 __stc_gdbus_handle_aul_changestate,
212 static stc_error_e __ground_status_monitor_init(stc_s *stc)
217 ret_value_msg_if(stc == NULL, STC_ERROR_INVALID_PARAMETER, "failed to get stc data");
219 size = sizeof(signal_map) / sizeof(signal_map[0]);
221 for (i = 0; i < size && signal_map[i].member != NULL; i++) {
222 signal_map[i].sub_id =
223 g_dbus_connection_signal_subscribe(stc->connection,
225 signal_map[i].interface,
226 signal_map[i].member,
229 G_DBUS_SIGNAL_FLAGS_NONE,
230 signal_map[i].callback,
231 signal_map[i].user_data,
233 STC_LOGI("Successfully subscribed [%s] signal",
234 signal_map[i].member);
237 return STC_ERROR_NONE;
240 static stc_error_e __ground_status_monitor_deinit(stc_s *stc)
245 ret_value_msg_if(stc == NULL, STC_ERROR_INVALID_PARAMETER, "failed to get stc data");
247 size = sizeof(signal_map) / sizeof(signal_map[0]);
249 for (i = 0; i < size && signal_map[i].member != NULL; i++) {
250 g_dbus_connection_signal_unsubscribe(stc->connection,
251 signal_map[i].sub_id);
252 signal_map[i].sub_id = 0;
253 STC_LOGD("Successfully unsubscribed [%s] signal",
254 signal_map[i].member);
257 return STC_ERROR_NONE;
260 int stc_plugin_appstatus_register_changed_cb(stc_s *stc,
261 stc_plugin_app_state_changed_cb cb,
264 state_changed_cb = cb;
265 __ground_status_monitor_init(stc);
270 int stc_plugin_appstatus_deregister_changed_cb(stc_s *stc)
272 state_changed_cb = NULL;
273 __ground_status_monitor_deinit(stc);
277 int stc_plugin_popup_send_message(const char *content,
278 const char *type, const char *app_id, const char *iftype, const char *limit)
281 bundle *b = bundle_create();
283 bundle_add(b, "_SYSPOPUP_CONTENT_", content);
284 bundle_add(b, "_SYSPOPUP_TYPE_", type);
285 bundle_add(b, "_APP_ID_", app_id);
286 bundle_add(b, "_IF_TYPE_", iftype);
288 if (g_strcmp0(type, "warning_noti") == 0) {
289 bundle_add(b, "_WARN_LIMIT_", limit);
290 STC_LOGD("Warn message : content[%s] type[%s] app_id[%s] limit[%s]",
291 content, type, app_id, limit);
293 bundle_add(b, "_RESTRICTION_LIMIT_", limit);
294 STC_LOGD("Restriction message : content[%s] type[%s] app_id[%s] limit[%s]",
295 content, type, app_id, limit);
298 ret = syspopup_launch("net-popup", b);
305 API stc_plugin_appstatus_s stc_plugin_appstatus = {
306 .send_message_to_net_popup =
307 stc_plugin_popup_send_message,
308 .register_state_changed_cb =
309 stc_plugin_appstatus_register_changed_cb,
310 .deregister_state_changed_cb =
311 stc_plugin_appstatus_deregister_changed_cb