[TSAM-8704] Double press home key _Last app doesn't work 05/93705/2 accepted/tizen/common/20161102.121540 accepted/tizen/mobile/20161101.123020 accepted/tizen/wearable/20161101.123041 submit/tizen/20161101.073845
authorGeunsun, Lee <gs86.lee@samsung.com>
Tue, 25 Oct 2016 10:16:01 +0000 (19:16 +0900)
committerGeunsun, Lee <gs86.lee@samsung.com>
Tue, 25 Oct 2016 10:43:47 +0000 (19:43 +0900)
Change-Id: I2ea2cfa21aa03906c5dea97850c06a92094ceebb

CMakeLists.txt
include/status.h
include/util.h
packaging/starter.spec
src/status.c
src/wearable/hw_key.c

index 04a00d5..427877b 100644 (file)
@@ -135,6 +135,7 @@ pkg_check_modules(pkgs REQUIRED
        dbus-glib-1
        liblazymount
        libsystemd-daemon
+       rua
 )
 
 ENDIF()
index 2f77e51..0fb6eaa 100644 (file)
@@ -55,6 +55,8 @@ struct status_active_s {
 
 struct status_passive_s {
        int wms_wakeup_by_gesture_setting;
+       char *wms_clocks_set_idle;
+       int homescreen_watch_face_visibility;
        int setappl_ambient_mode_bool;
 
        int pm_key_ignore;
index 00a3c34..611c726 100644 (file)
 #define CLUSTER_HOME_PKG_NAME "org.tizen.cluster-home"
 #define EASY_HOME_PKG_NAME "org.tizen.easy-home"
 #define EASY_APPS_PKG_NAME "org.tizen.easy-apps"
+#define ISE_DEFAULT_PKG_NAME "ise-default"
 
 #ifdef TIZEN_PROFILE_COMMON
 #define HOMESCREEN_PKG_NAME MENU_SCREEN_PKG_NAME
-#else
+#elif TIZEN_PROFILE_MOBILE
 #define HOMESCREEN_PKG_NAME "org.tizen.homescreen-efl"
+#elif TIZEN_PROFILE_WEARABLE
+#define IDLE_CLOCK_PKG_NAME "org.tizen.classic-watch"
+#define HOMESCREEN_PKG_NAME "org.tizen.w-home"
 #endif
 
 #define TASKMGR_PKG_NAME "org.tizen.task-mgr"
index fb51bdb..a8228d4 100644 (file)
@@ -30,6 +30,7 @@ BuildRequires:  pkgconfig(efl-extension)
 BuildRequires:  pkgconfig(liblazymount)
 BuildRequires:  pkgconfig(libsystemd-daemon)
 
+BuildRequires:  pkgconfig(rua)
 BuildRequires:  pkgconfig(feedback)
 BuildRequires:  pkgconfig(db-util)
 BuildRequires:  pkgconfig(dlog)
index ad2d61f..e0a6436 100644 (file)
@@ -50,7 +50,9 @@ static struct status_active_s s_status_active = {
 
 static struct status_passive_s s_status_passive = {
        .wms_wakeup_by_gesture_setting = -1,
+       .wms_clocks_set_idle = NULL,
        .setappl_ambient_mode_bool = -1,
+       .homescreen_watch_face_visibility = -1,
 
        .pm_key_ignore = -1,
        .call_state = -1,
@@ -228,10 +230,19 @@ static void _status_passive_change_cb(keynode_t* node, void *data)
 #ifdef TIZEN_PROFILE_WEARABLE
        if (!strcmp(key_name, VCONFKEY_WMS_WAKEUP_BY_GESTURE_SETTING)) {
                s_status_passive.wms_wakeup_by_gesture_setting = vconf_keynode_get_int(node);
+       } else if (!strcmp(key_name, VCONFKEY_WMS_CLOCKS_SET_IDLE)) {
+               char *tmp = vconf_keynode_get_str(node);
+
+               if (tmp) {
+                       free(s_status_passive.wms_clocks_set_idle);
+                       s_status_passive.wms_clocks_set_idle = tmp;
+               }
        } else if (!strcmp(key_name, VCONFKEY_SETAPPL_AMBIENT_MODE_BOOL)) {
                s_status_passive.setappl_ambient_mode_bool = vconf_keynode_get_int(node);
        } else if (!strcmp(key_name, VCONFKEY_SETAPPL_DOUBLE_PRESS_HOME_KEY)) {
                s_status_passive.setappl_double_press_home_key = vconf_keynode_get_int(node);
+       } else if (!strcmp(key_name, VCONFKEY_HOMESCREEN_WATCH_FACE_VISIBILITY)) {
+               s_status_passive.homescreen_watch_face_visibility = vconf_keynode_get_bool(node);
        } else
 #endif
        if (!strcmp(key_name, VCONFKEY_PM_KEY_IGNORE)) {
@@ -355,6 +366,17 @@ int status_register(void)
                s_status_passive.wms_wakeup_by_gesture_setting = -1;
        }
 
+       if (vconf_notify_key_changed(VCONFKEY_WMS_CLOCKS_SET_IDLE, _status_passive_change_cb, NULL) < 0) {
+               _E("Failed to register add the callback for %s", VCONFKEY_WMS_CLOCKS_SET_IDLE);
+       }
+       if (!(s_status_passive.wms_clocks_set_idle = vconf_get_str(VCONFKEY_WMS_CLOCKS_SET_IDLE))) {
+               _E("Failed to get vconfkey[%s]", VCONFKEY_WMS_CLOCKS_SET_IDLE);
+               s_status_passive.wms_clocks_set_idle = strdup(IDLE_CLOCK_PKG_NAME);
+               if (!s_status_passive.wms_clocks_set_idle) {
+                       _E("Failed to duplicate string");
+               }
+       }
+
        if (vconf_notify_key_changed(VCONFKEY_SETAPPL_AMBIENT_MODE_BOOL, _status_passive_change_cb, NULL) < 0) {
                _E("Failed to register add the callback for %s", VCONFKEY_SETAPPL_AMBIENT_MODE_BOOL);
        } else if (vconf_get_int(VCONFKEY_SETAPPL_AMBIENT_MODE_BOOL, &s_status_passive.setappl_ambient_mode_bool) < 0) {
@@ -362,13 +384,19 @@ int status_register(void)
                s_status_passive.setappl_ambient_mode_bool = -1;
        }
 
+       if (vconf_notify_key_changed(VCONFKEY_HOMESCREEN_WATCH_FACE_VISIBILITY, _status_passive_change_cb, NULL) < 0) {
+               _E("Failed to register add the callback for %s", VCONFKEY_HOMESCREEN_WATCH_FACE_VISIBILITY);
+       } else if (vconf_get_bool(VCONFKEY_HOMESCREEN_WATCH_FACE_VISIBILITY, &s_status_passive.homescreen_watch_face_visibility) < 0) {
+               _E("Failed to get vconfkey[%s]", VCONFKEY_HOMESCREEN_WATCH_FACE_VISIBILITY);
+               s_status_passive.homescreen_watch_face_visibility = -1;
+       }
+
        if (vconf_notify_key_changed(VCONFKEY_SETAPPL_DOUBLE_PRESS_HOME_KEY, _status_passive_change_cb, NULL) < 0) {
                _E("Failed to register add the callback for %s", VCONFKEY_SETAPPL_DOUBLE_PRESS_HOME_KEY);
        } else if (vconf_get_int(VCONFKEY_SETAPPL_DOUBLE_PRESS_HOME_KEY, &s_status_passive.setappl_double_press_home_key) < 0) {
                _E("Failed to get vconfkey[%s]", VCONFKEY_SETAPPL_DOUBLE_PRESS_HOME_KEY);
                s_status_passive.setappl_double_press_home_key = -1;
        }
-
 #endif
 
        if (vconf_notify_key_changed(VCONFKEY_PM_KEY_IGNORE, _status_passive_change_cb, NULL) < 0) {
@@ -437,7 +465,6 @@ int status_register(void)
        if (vconf_notify_key_changed(VCONFKEY_SETAPPL_3RD_LOCK_PKG_NAME_STR, _status_passive_change_cb, NULL) < 0) {
                _E("Failed to register add the callback for %s", VCONFKEY_SETAPPL_3RD_LOCK_PKG_NAME_STR);
        }
-
        if (!(s_status_passive.setappl_3rd_lock_pkg_name_str = vconf_get_str(VCONFKEY_SETAPPL_3RD_LOCK_PKG_NAME_STR))) {
                _E("Failed to get vconfkey[%s]", VCONFKEY_SETAPPL_3RD_LOCK_PKG_NAME_STR);
                s_status_passive.setappl_3rd_lock_pkg_name_str = strdup(STATUS_DEFAULT_LOCK_PKG_NAME);
@@ -505,10 +532,19 @@ void status_unregister(void)
                _E("Failed to unregister the callback for %s", VCONFKEY_WMS_WAKEUP_BY_GESTURE_SETTING);
        }
 
+       if (vconf_ignore_key_changed(VCONFKEY_WMS_CLOCKS_SET_IDLE, _status_passive_change_cb) < 0) {
+               _E("Failed to unregister the callback for %s", VCONFKEY_WMS_CLOCKS_SET_IDLE);
+       }
+       free(s_status_passive.wms_clocks_set_idle);
+
        if (vconf_ignore_key_changed(VCONFKEY_SETAPPL_AMBIENT_MODE_BOOL, _status_passive_change_cb) < 0) {
                _E("Failed to unregister the callback for %s", VCONFKEY_SETAPPL_AMBIENT_MODE_BOOL);
        }
 
+       if (vconf_ignore_key_changed(VCONFKEY_HOMESCREEN_WATCH_FACE_VISIBILITY, _status_passive_change_cb) < 0) {
+               _E("Failed to unregister the callback for %s", VCONFKEY_HOMESCREEN_WATCH_FACE_VISIBILITY);
+       }
+
        if (vconf_ignore_key_changed(VCONFKEY_SETAPPL_DOUBLE_PRESS_HOME_KEY, _status_passive_change_cb) < 0) {
                _E("Failed to unregister the callback for %s", VCONFKEY_SETAPPL_DOUBLE_PRESS_HOME_KEY);
        }
index 9c11c20..2957a85 100644 (file)
@@ -126,7 +126,7 @@ static Eina_Bool _powerkey_timer_cb(void *data)
                return ECORE_CALLBACK_CANCEL;
        }
 
-       home_mgr_launch_home_by_power();
+       home_mgr_launch_home();
 
        return ECORE_CALLBACK_CANCEL;
 }
@@ -388,6 +388,8 @@ void hw_key_destroy_window(void)
 #include <feedback.h>
 #include <vconf.h>
 #include <aul.h>
+#include <rua.h>
+#include <pkgmgr-info.h>
 
 #include "hw_key.h"
 #include "util.h"
@@ -404,7 +406,6 @@ void hw_key_destroy_window(void)
 #define APP_CONTROL_OPERATION_MAIN_VALUE "http://tizen.org/appcontrol/operation/main"
 
 #define USE_DBUS_POWEROFF 1
-#define W_TASKMGR_PKGNAME "org.tizen.task-mgr"
 
 const char *key_name[KEY_NAME_MAX] = {
        "XF86AudioRaiseVolume",
@@ -515,20 +516,118 @@ static Eina_Bool _long_press_timer_cb(void* data)
 
 
 
+static void _launch_last_app(void)
+{
+       struct rua_rec record;
+       char **table = NULL;
+       int nrows = 0;
+       int ncols = 0;
+       int row = 0;
+       pkgmgrinfo_appinfo_h handle;
+       bool is_taskmanage = false;
+       int ret = 0;
+       char *last_app = NULL;
+
+       if (rua_init()) {
+               _E("Failed to initialize rua");
+               return;
+       }
+
+       if (rua_history_load_db(&table, &nrows, &ncols) || !table) {
+               _E("Failed to load rua history db");
+
+               if (rua_fini()) {
+                       _E("Failed to finalize rua");
+               }
+
+               return;
+       }
+
+       for (row = 0; row < nrows; row++) {
+               if (rua_history_get_rec(&record, table, nrows, ncols, row)) {
+                       _E("Failed to get rua history record");
+                       continue;
+               }
+
+               _D("[%d] rua history(%s)", row, record.pkg_name);
+
+               if (!strcmp(record.pkg_name, HOMESCREEN_PKG_NAME) ||
+                               !strcmp(record.pkg_name, ISE_DEFAULT_PKG_NAME) ||
+                               !strcmp(record.pkg_name, status_passive_get()->wms_clocks_set_idle)) {
+                       continue;
+               }
+
+               if (PMINFO_R_OK != pkgmgrinfo_appinfo_get_appinfo(record.pkg_name, &handle)) {
+                       _E("Failed to get app info(%s)", record.pkg_name);
+                       continue;
+               }
+
+               if (PMINFO_R_OK != pkgmgrinfo_appinfo_is_taskmanage(handle, &is_taskmanage)) {
+                       _E("Failed to get taskmanage info");
+                       pkgmgrinfo_appinfo_destroy_appinfo(handle);
+                       continue;
+               }
+
+               if (!is_taskmanage) {
+                       _E("This app(%s) is not showing on taskmanager", record.pkg_name);
+                       pkgmgrinfo_appinfo_destroy_appinfo(handle);
+                       continue;
+               }
+
+               if (PMINFO_R_OK != pkgmgrinfo_appinfo_get_pkgid(handle, &last_app)) {
+                       _E("Failed to get pkgid");
+                       pkgmgrinfo_appinfo_destroy_appinfo(handle);
+                       continue;
+               }
+
+               if (last_app == NULL) {
+                       _E("last pkg name is NULL");
+                       pkgmgrinfo_appinfo_destroy_appinfo(handle);
+                       continue;
+               }
+
+               _D("last app : %s", last_app);
+               process_mgr_must_launch(last_app, NULL, NULL, NULL, NULL);
+
+               pkgmgrinfo_appinfo_destroy_appinfo(handle);
+
+               break;
+       }
+
+       if (rua_history_unload_db(&table)) {
+               _E("Failed to unload rua history db");
+       }
+
+       if (rua_fini()) {
+               _E("Failed to finalize rua");
+       }
+}
+
+
+
 static void _do_double_home_key_operation(void)
 {
        int op = 0;
+       int is_watch_face_shown = 0;
 
        op = status_passive_get()->setappl_double_press_home_key;
        _D("Dobule home key operation : %d", op);
 
+       is_watch_face_shown = status_passive_get()->homescreen_watch_face_visibility;
+       _D("Watch face status : %d", is_watch_face_shown);
+
        switch(op) {
        case VCONFKEY_DOUBLE_PRESS_HOME_KEY_NONE:
                break;
        case VCONFKEY_DOUBLE_PRESS_HOME_KEY_LAST_APP:
+               if (is_watch_face_shown) {
+                       _launch_last_app();
+               } else {
+                       home_mgr_launch_home_by_power((key_info.is_home_focused == EINA_TRUE) ? "powerkey_focused" : "powerkey_unfocused");
+               }
                break;
        case VCONFKEY_DOUBLE_PRESS_HOME_KEY_RECENT_APPS:
-               process_mgr_must_launch(W_TASKMGR_PKGNAME, NULL, NULL, NULL, NULL);
+               process_mgr_must_launch(TASKMGR_PKG_NAME, NULL, NULL, NULL, NULL);
                break;
        default:
                _E("invalid operation(%d)", op);