#include "AppActionLaunch.h"
#include <algorithm>
+#include <aul.h>
#include <app_control.h>
#include <app_manager.h>
#include <app_manager_extension.h>
MODES_NAMESPACE_USE;
const std::string AppActionLaunch::NAME = "launch";
-std::list<std::string> AppActionLaunch::appidList;
AppActionLaunch::AppActionLaunch()
- : AppAction(NAME)
+ : AppAction(NAME), cb(nullptr), cbData(nullptr)
{
-}
-
-void AppActionLaunch::appContextStatusCallback(app_context_h app_context, app_context_status_e status, void *user_data)
-{
- DBG("appContextStatusCallback(status:%d)", status);
- if (APP_CONTEXT_STATUS_TERMINATED != status)
- return;
-
- char *appid = NULL;
- int ret = app_context_get_app_id(app_context, &appid);
- if (APP_MANAGER_ERROR_NONE != ret) {
- ERR("app_context_get_app_id() Fail(%d)", ret);
- return;
- }
-
- appidList.remove(appid);
-
- free(appid);
- return;
+ aul_launch_init(NULL, NULL);
}
int AppActionLaunch::set(const std::string &val)
{
- DBG("id(%s)", val.c_str());
-
- auto found = std::find(appidList.begin(), appidList.end(), val);
-
- if (found == appidList.end())
- {
- bool running;
- app_manager_is_running(val.c_str(), &running);
-
- if (running) {
- ERR("It's already running before started mode-supervisor daemon");
- return MODES_ERROR_CONFLICT;
- }
-
- app_control_h service;
- app_control_create(&service);
- app_control_set_app_id(service, val.c_str());
- app_control_set_operation(service, APP_CONTROL_OPERATION_DEFAULT);
- app_control_set_launch_mode(service, APP_CONTROL_LAUNCH_MODE_SINGLE);
-
- int ret = app_control_send_launch_request(service, NULL, NULL);
- if (APP_CONTROL_ERROR_NONE != ret) {
- ERR("app_control_send_launch_request() Fail(%s)", get_error_message(ret));
- return MODES_ERROR_SYSTEM;
- }
- app_control_destroy(service);
-
- appidList.push_back(val);
-
- DBG("APP_CONTEXT_EVENT_LAUNCHED(appid : %s) added list\n", val.c_str());
-
- int err = app_manager_set_app_context_status_cb(AppActionLaunch::appContextStatusCallback, val.c_str(), NULL);
- if (APP_MANAGER_ERROR_NONE != err) {
- ERR("app_manager_set_app_context_status_cb() Fail(%s)", get_error_message(err));
- return MODES_ERROR_SYSTEM;
- }
-
- appID = val;
+ bool running;
+ app_manager_is_running(val.c_str(), &running);
+ if (running)
+ INFO("It's already running before started mode-supervisor daemon");
+
+ app_control_h service;
+ app_control_create(&service);
+ app_control_set_app_id(service, val.c_str());
+ app_control_set_operation(service, APP_CONTROL_OPERATION_DEFAULT);
+ app_control_set_launch_mode(service, APP_CONTROL_LAUNCH_MODE_SINGLE);
+
+ int ret = app_control_send_launch_request(service, nullptr, nullptr);
+ if (APP_CONTROL_ERROR_NONE != ret) {
+ ERR("app_control_send_launch_request() Fail(%s)", get_error_message(ret));
+ return MODES_ERROR_SYSTEM;
}
+ app_control_destroy(service);
- return MODES_ERROR_NONE;
-}
+ appID = val;
-int AppActionLaunch::get(std::string *val)
-{
- if(val)
- *val = appID;
return MODES_ERROR_NONE;
}
return;
}
- int ret = app_manager_unset_app_context_status_cb(appContextStatusCallback, appID.c_str());
- if (APP_MANAGER_ERROR_NONE != ret)
- ERR("app_manager_unset_app_context_status_cb() Fail(%s)", get_error_message(ret));
-
- appidList.remove(appID);
-
- ret = app_manager_get_app_context(appID.c_str(), &runAppContext);
+ int ret = app_manager_get_app_context(appID.c_str(), &runAppContext);
if (APP_MANAGER_ERROR_NONE != ret) {
ERR("app_manager_get_app_context(%s) Fail(%s)", appID.c_str(), get_error_message(ret));
return;
appID = archive;
return MODES_ERROR_NONE;
}
+
+int AppActionLaunch::setChangedCallback(valueChangedCB callback, void *userData)
+{
+ RETV_IF(nullptr == callback, MODES_ERROR_INVALID_PARAMETER);
+
+ int err = app_manager_set_app_context_status_cb(appContextStatusCB, appID.c_str(), this);
+ if (APP_MANAGER_ERROR_NONE != err) {
+ ERR("app_manager_set_app_context_status_cb() Fail(%s)", get_error_message(err));
+ return MODES_ERROR_SYSTEM;
+ }
+
+ cb = callback;
+ cbData = userData;
+
+ return MODES_ERROR_NONE;
+}
+
+void AppActionLaunch::unSetChangedCallback(valueChangedCB callback, void *userData)
+{
+ int ret = app_manager_unset_app_context_status_cb(appContextStatusCB, appID.c_str());
+ if (APP_MANAGER_ERROR_NONE != ret)
+ ERR("app_manager_unset_app_context_status_cb() Fail(%s)", get_error_message(ret));
+
+ cb = nullptr;
+ cbData = nullptr;
+}
+
+void AppActionLaunch::appContextStatusCB(app_context_h app_context, app_context_status_e status, void *userData)
+{
+ RET_IF(nullptr == userData);
+ RET_IF(APP_CONTEXT_STATUS_TERMINATED != status);
+
+ char *appid = nullptr;
+ int ret = app_context_get_app_id(app_context, &appid);
+ if (APP_MANAGER_ERROR_NONE != ret) {
+ ERR("app_context_get_app_id() Fail(%d)", ret);
+ return;
+ }
+
+ AppActionLaunch *action = (AppActionLaunch*)userData;
+ if (appid == action->appID && action->cb)
+ action->cb(action->cbData);
+
+ free(appid);
+ return;
+}
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-#include <glib.h>
+#include <iostream>
#include <string>
+
#include <gtest/gtest.h>
+#include <glib.h>
+#include <aul.h>
#include <Plugin.h>
#include <modes_errors.h>
#include <app_manager.h>
plugin = NULL;
}
- static gboolean appPluginUndoConflictIdler(gpointer data)
+ static gboolean appUndoTimeout(gpointer data)
+ {
+ PluginAction *action = (PluginAction*)data;
+ plugin->undo(action);
+ g_main_loop_quit(loop);
+ return false;
+ }
+
+ static gboolean checkSetUndoIdler(gpointer data)
{
PluginAction *action;
- result = plugin->set("launch", std::string("org.tizen.net-popup"), &action);
+ result = plugin->set("launch", std::string(testApp), &action);
EXPECT_EQ(MODES_ERROR_NONE, result);
- app_context_h runAppContext = NULL;
- app_manager_get_app_context("org.tizen.net-popup", &runAppContext);
- app_manager_terminate_app(runAppContext);
- plugin->undo(action);
- g_main_loop_quit(loop);
+ if (MODES_ERROR_NONE == result)
+ g_timeout_add(1000, appUndoTimeout, action);
+ else
+ g_main_loop_quit(loop);
return G_SOURCE_REMOVE;
}
- static gboolean appPluginSetUndoTimeout(gpointer data)
+ static void changedCB(void *userData)
{
- PluginAction *action = (PluginAction*)data;
- plugin->undo(action);
- g_main_loop_quit(loop);
- return false;
+ const char *appName = (char*)userData;
+ std::cout << appName << "is terminated" << std::endl;
}
- static gboolean appPluginSetUndoIdler(gpointer data)
+ static gboolean checkChangedCBIdler(gpointer data)
{
PluginAction *action;
- result = plugin->set("launch", std::string("org.tizen.net-popup"), &action);
+ result = plugin->set("launch", std::string(testApp), &action);
EXPECT_EQ(MODES_ERROR_NONE, result);
+ int ret = action->setChangedCallback(changedCB, (void*)testApp);
+ EXPECT_EQ(MODES_ERROR_NONE, ret);
+
+ app_context_h runAppContext = NULL;
+ app_manager_get_app_context(testApp, &runAppContext);
+ app_manager_terminate_app(runAppContext);
+
if (MODES_ERROR_NONE == result)
- g_timeout_add(1000, appPluginSetUndoTimeout, action);
+ g_timeout_add(3000, appUndoTimeout, action);
else
g_main_loop_quit(loop);
return G_SOURCE_REMOVE;
}
+ static const char *testApp;
static int result;
static GMainLoop *loop;
static GThread *my_thread;
static Plugin *plugin;
};
+const char *AppPluginTest::testApp = "org.tizen.setting";
int AppPluginTest::result = 0;
Plugin *AppPluginTest::plugin = NULL;
GMainLoop *AppPluginTest::loop = NULL;
-TEST_F(AppPluginTest, setUndoPluginApp)
+TEST_F(AppPluginTest, CheckSetUndo)
{
- g_idle_add(appPluginSetUndoIdler, plugin);
+ g_idle_add(checkSetUndoIdler, plugin);
g_main_loop_run(loop);
}
-TEST_F(AppPluginTest, undoConflictPluginApp)
+TEST_F(AppPluginTest, checkChangedCB)
{
- g_idle_add(appPluginUndoConflictIdler, nullptr);
+ sleep(3);
+ g_idle_add(checkChangedCBIdler, nullptr);
g_main_loop_run(loop);
}