Launch the application asynchronously if it is an watch widget.
[model] Redwood,Kiran,B3(Wearable)
[binary_type] AP
[customer] Docomo/Orange/ATT/Open
[issue#] N/A
[problem]
[cause]
[solution]
[team] HomeTF
[request]
[horizontal_expansion]
Change-Id: I6df2aefe4c57f575512c11c0536e5dcae2ae1bb2
* limitations under the License.
*/
+#define CATEGORY_WATCH_CLOCK "org.tizen.wmanager.WATCH_CLOCK"
+
enum alter_type {
ALTER_CREATE,
ALTER_DESTROY
* \param[in] period
* \return slave_node
*/
-extern struct slave_node *slave_create(const char *name, int is_secured, const char *abi, const char *pkgname, int network, const char *hw_acceleration);
+extern struct slave_node *slave_create(const char *name, int is_secured, const char *abi, const char *pkgname, int network, const char *hw_acceleration, int launch_async);
/*!
* \brief
static inline int assign_new_slave(const char *slave_pkgname, struct pkg_info *info)
{
char *s_name;
+ int launch_async = 0;
s_name = util_slavename();
if (!s_name) {
return WIDGET_ERROR_FAULT;
}
- DbgPrint("New slave[%s] is assigned for %s (using %s / abi[%s] / accel[%s])\n", s_name, info->widget_id, slave_pkgname, info->abi, info->hw_acceleration);
- info->slave = slave_create(s_name, info->secured, info->abi, slave_pkgname, info->network, info->hw_acceleration);
+ launch_async = (!!package_category(info) && !strcmp(package_category(info), CATEGORY_WATCH_CLOCK));
+
+ DbgPrint("New slave[%s] is assigned for %s (using %s / abi[%s] / accel[%s] / launch_async[%d])\n", s_name, info->widget_id, slave_pkgname, info->abi, info->hw_acceleration, launch_async);
+ info->slave = slave_create(s_name, info->secured, info->abi, slave_pkgname, info->network, info->hw_acceleration, launch_async);
DbgFree(s_name);
#define LAZY_GBAR_OPEN_TAG "lazy,gbar,open"
#define LAZY_GBAR_CLOSE_TAG "lazy,gbar,close"
-#define CATEGORY_WATCH_CLOCK "org.tizen.wmanager.WATCH_CLOCK"
-
#define ACCESS_TYPE_DOWN 0
#define ACCESS_TYPE_MOVE 1
#define ACCESS_TYPE_UP 2
slave = slave_find_by_pkgname(pkgname);
if (!slave) {
- slave = slave_create(slavename, secured, abi, pkgname, 0, acceleration);
+ slave = slave_create(slavename, secured, abi, pkgname, 0, acceleration, 0);
if (!slave) {
return WIDGET_ERROR_FAULT;
}
network = package_network(info);
}
- slave = slave_create(slavename, secured, abi, pkgname, network, acceleration);
+ slave = slave_create(slavename, secured, abi, pkgname, network, acceleration, 0);
if (!slave) {
ErrPrint("Failed to create a new slave for %s\n", slavename);
DbgFree(widget_id);
struct packet *result = NULL;
struct slave_node *slave;
const char *slavename;
+ const char *slave_pkgname;
const char *acceleration;
const char *abi;
char *widget_id;
char pkgname[pathconf("/", _PC_PATH_MAX)];
double timestamp;
- ret = packet_get(packet, "disss", ×tamp, &secured, &slavename, &acceleration, &abi);
- if (ret != 5) {
+ ret = packet_get(packet, "dissss", ×tamp, &secured, &slavename, &slave_pkgname, &acceleration, &abi);
+ if (ret != 6) {
ErrPrint("Parameter is not matched\n");
goto out;
}
slave = slave_find_by_name(slavename);
if (!slave) { /* Try again to find a slave using pid */
slave = slave_find_by_pid(pid);
+ if (!slave) {
+ slave = slave_find_by_pkgname(slave_pkgname);
+ ErrPrint("Failed to find, Find it using pkgname(%s) - %p\n", slave_pkgname, slave);
+ }
}
if (aul_app_get_pkgname_bypid(pid, pkgname, sizeof(pkgname)) != AUL_R_OK) {
package_del_instance_by_category(CATEGORY_WATCH_CLOCK, NULL);
}
- slave = slave_create(slavename, secured, abi, pkgname, network, acceleration);
+ /**
+ * If a provider sent hello_sync, we will assumes it as a watch widget.
+ * In this case, activate it again asynchronously.
+ */
+ slave = slave_create(slavename, secured, abi, pkgname, network, acceleration, 1);
if (!slave) {
ErrPrint("Failed to create a new slave for %s\n", slavename);
goto out;
int reactivate_instances;
int reactivate_slave;
+ int launch_async;
+
pid_t pid;
enum event_process {
return WIDGET_ERROR_NONE;
}
-static inline struct slave_node *create_slave_node(const char *name, int is_secured, const char *abi, const char *pkgname, int network, const char *hw_acceleration)
+static inline struct slave_node *create_slave_node(const char *name, int is_secured, const char *abi, const char *pkgname, int network, const char *hw_acceleration, int launch_async)
{
struct slave_node *slave;
slave->state = SLAVE_TERMINATED;
slave->network = network;
slave->relaunch_count = WIDGET_CONF_SLAVE_RELAUNCH_COUNT;
+ slave->launch_async = launch_async;
xmonitor_add_event_callback(XMONITOR_PAUSED, xmonitor_pause_cb, slave);
xmonitor_add_event_callback(XMONITOR_RESUMED, xmonitor_resume_cb, slave);
return slave->refcnt;
}
-HAPI struct slave_node *slave_create(const char *name, int is_secured, const char *abi, const char *pkgname, int network, const char *hw_acceleration)
+HAPI struct slave_node *slave_create(const char *name, int is_secured, const char *abi, const char *pkgname, int network, const char *hw_acceleration, int launch_async)
{
struct slave_node *slave;
return slave;
}
- slave = create_slave_node(name, is_secured, abi, pkgname, network, hw_acceleration);
+ slave = create_slave_node(name, is_secured, abi, pkgname, network, hw_acceleration, launch_async);
if (!slave) {
return NULL;
}
bundle_add(param, WIDGET_CONF_BUNDLE_SLAVE_ABI, slave->abi);
bundle_add(param, WIDGET_CONF_BUNDLE_SLAVE_HW_ACCELERATION, slave->hw_acceleration);
- slave->pid = (pid_t)aul_launch_app(slave_pkgname(slave), param);
+ if (slave->launch_async) {
+ ErrPrint("Launch App Async [%s]\n", slave_pkgname(slave));
+ slave->pid = (pid_t)aul_launch_app_async(slave_pkgname(slave), param);
+ } else {
+ ErrPrint("Launch App Sync [%s]\n", slave_pkgname(slave));
+ slave->pid = (pid_t)aul_launch_app(slave_pkgname(slave), param);
+ }
bundle_free(param);
bundle_add(param, WIDGET_CONF_BUNDLE_SLAVE_ABI, slave->abi);
bundle_add(param, WIDGET_CONF_BUNDLE_SLAVE_HW_ACCELERATION, slave->hw_acceleration);
- slave->pid = (pid_t)aul_launch_app(slave_pkgname(slave), param);
+ if (slave->launch_async) {
+ ErrPrint("Launch App Async [%s]\n", slave_pkgname(slave));
+ slave->pid = (pid_t)aul_launch_app_async(slave_pkgname(slave), param);
+ } else {
+ ErrPrint("Launch App Sync [%s]\n", slave_pkgname(slave));
+ slave->pid = (pid_t)aul_launch_app(slave_pkgname(slave), param);
+ }
bundle_free(param);
EINA_LIST_FOREACH(s_info.slave_list, l, slave) {
if (!strcmp(slave_pkgname(slave), pkgname)) {
- if (slave_pid(slave) == (pid_t)-1) {
+ if (slave_pid(slave) == (pid_t)-1 || slave_pid(slave) == (pid_t)0) {
return slave;
}
}
}
pid = slave_pid(slave);
- if (pid < 0) {
+ if (pid <= 0) {
+ DbgPrint("Skip for %d\n", pid);
return WIDGET_ERROR_INVALID_PARAMETER;
}
}
pid = slave_pid(slave);
- if (pid < 0) {
+ if (pid <= 0) {
+ DbgPrint("Skip for %d\n", pid);
return WIDGET_ERROR_INVALID_PARAMETER;
}