UI: supports reboot from context menu
authorJinhyung Choi <jinh0.choi@samsung.com>
Wed, 4 Nov 2015 02:33:51 +0000 (11:33 +0900)
committerSeokYeon Hwang <syeon.hwang@samsung.com>
Thu, 26 Nov 2015 04:46:08 +0000 (13:46 +0900)
When a malfunction of emulator occurs, such as no response from the guest OS,
what a developer can do is selecting "force close"
and restarting from emulator manager.

In order to avoid the inconvenience of doing it, reboot menu is added.
It is working directly to hardware after requesting sync() to guest OS

         ----------------
         | Context menu |
         ----------------
         |   reboot     |
         ----------------                         ----------
                |                                 | emuld  |
     ------------------------                     ----------
     | 1. send sync message |   ------------->    | sync() |
     | 2. start a timer     |                     ----------
     ------------------------
               | The timer expires after 1s
   -------------------------------
   | qemu_system_reset_request() |
   -------------------------------

Conflicts:
tizen/src/extension/ui/resource/skins/tv-1080x1920/layout.xml
tizen/src/extension/ui/resource/skins/tv-1920x1080/layout.xml
tizen/src/extension/ui/resource/skins/tv-2560x1080/layout.xml

Change-Id: I3c3c31c2cc19065f53b620d83c79e68e0183db53
Signed-off-by: Jinhyung Choi <jinh0.choi@samsung.com>
(cherry picked from commit 14fc61baff1e8b48cbcb810a8392a1ac601f2511)

22 files changed:
tizen/src/ecs/ecs.h
tizen/src/ecs/ecs_msg.c
tizen/src/emulator.c
tizen/src/ui/menu/contextmenu.cpp
tizen/src/ui/menu/contextmenu.h
tizen/src/ui/menu/menuitem.h
tizen/src/ui/resource/icons/system_reset.png [new file with mode: 0644]
tizen/src/ui/resource/resource.qrc
tizen/src/ui/resource/skins/mobile-320x480-3btn/layout.xml
tizen/src/ui/resource/skins/mobile/mobile-480x800-3btn/layout.xml
tizen/src/ui/resource/skins/mobile/mobile-540x960-3btn/layout.xml
tizen/src/ui/resource/skins/mobile/mobile-720x1280-3btn/layout.xml
tizen/src/ui/resource/skins/mobile/mobile-general-3btn/layout.xml
tizen/src/ui/resource/skins/tv/tv-1920x1080/layout.xml
tizen/src/ui/resource/skins/wearable/wearable-320x320-1btn/layout.xml
tizen/src/ui/resource/skins/wearable/wearable-360x360-1btn/layout.xml
tizen/src/ui/resource/skins/wearable/wearable-360x480-1btn/layout.xml
tizen/src/ui/resource/skins/wearable/wearable-general-1btn/layout.xml
tizen/src/ui/resource/skins/wearable/wearableO-360x360-2btn/layout.xml
tizen/src/ui/resource/skins/wearableO-360x360-1btn/layout.xml
tizen/src/ui/xmllayoutkeyword.h
tizen/src/ui/xmllayoutparser.cpp

index b201a153b482b450bd5e70b01bd4c1039acc69fe..c1657f9fcbaabd2850393609edb623f97095c7c6 100644 (file)
@@ -62,6 +62,7 @@
 #define MSG_TYPE_GUESTIP        "guest_ip"
 #define MSG_TYPE_HDS            "hds"
 #define MSG_TYPE_PACKAGE        "package"
+#define MSG_TYPE_SYSTEM         "system"
 
 #define MSG_GROUP_STATUS        15
 
@@ -184,7 +185,12 @@ bool ntf_to_monitor(const char* data, const int len);
 bool send_msg_to_guest(const char* cmd, int group, int action,
                        char* data, int data_len);
 
-void send_shutdown_request(void);
+enum ecs_system_action {
+    ECS_SYSTEM_ACTION_FORCE_CLOSE,
+    ECS_SYSTEM_ACTION_REBOOT
+};
+
+void send_shutdown_request(int action);
 
 void make_send_device_ntf (char* cmd, int group, int action, char* data);
 
index f54b4500b295147c645140d6dce5a796e10101f1..b8fb4281c675c3313eae0014b78a86923aadd9e3 100644 (file)
@@ -193,9 +193,9 @@ bool send_msg_to_guest(const char* cmd, int group, int action, char* data, int d
     return true;
 }
 
-void send_shutdown_request(void)
+void send_shutdown_request(int action)
 {
-    int ret = send_msg_to_guest("system", 0, 0, NULL, 0);
+    int ret = send_msg_to_guest(MSG_TYPE_SYSTEM, 0, action, NULL, 0);
     if (!ret) {
         LOG_SEVERE("fail to send evdi shutdown system call to emuld.\n");
     }
index 8d85458892255a34f19883d6b799c70d0dfb8cdb..e8398e89064f80535983716b7ff9af68fb2a8981 100644 (file)
@@ -130,7 +130,7 @@ static Notifier emulator_exit = { .notify = emulator_notify_exit };
 
 static void* run_timed_shutdown_thread(void* args)
 {
-    send_shutdown_request();
+    send_shutdown_request(ECS_SYSTEM_ACTION_FORCE_CLOSE);
 
     const int sleep_interval_time = 1000; /* milli-seconds */
     const int timeout_for_shutdown = (uintptr_t)args;
index 90f77dea6ccd7dda0b7a49e70eb67b92ad859967..72ea6d55b46a085c534c445e6986f045250a6945 100644 (file)
@@ -40,6 +40,9 @@
 extern "C" {
 // FIXME: To avoid very complex header inclusion chains
 void qemu_system_graceful_shutdown_request(unsigned int sec);
+void qemu_system_reset_request(void);
+#define MENU_ACTION_REBOOT      1
+void send_shutdown_request(int action);
 
 #include "util/osutil.h"
 #include "util/device_hotplug.h"
@@ -80,6 +83,9 @@ ContextMenu::ContextMenu(QWidget *parent) : QMenu(parent)
     /* for close */
     longPressTimer = new QTimer(this);
 
+    /* for system reset */
+    rebootTimer = new QTimer(this);
+
     createItems(this, this->parent->getUiInfo()->getMenuList());
 
     installEventFilter(this);
@@ -143,6 +149,10 @@ void ContextMenu::createItems(QMenu *menu, QList<MenuItem *> &list)
             /* About menu */
             createAboutItem(menu, item);
             break;
+        case MenuItemType::systemResetItem:
+            /* System Reset menu */
+            createSystemResetItem(menu, item);
+            break;
         case MenuItemType::forceCloseItem:
             /* Force Close menu */
             createForceCloseItem(menu, item);
@@ -525,6 +535,23 @@ void ContextMenu::createAboutItem(QMenu *menu, MenuItem *item)
     item->setAction(actionAbout);
 }
 
+void ContextMenu::createSystemResetItem(QMenu *menu, MenuItem *item)
+{
+    if (menu == NULL || item == NULL) {
+        return;
+    }
+
+    QString menuName = item->getName();
+    actionSystemReset = addGeneralAction(
+        menu, QIcon(QPixmap(":/icons/system_reset.png")),
+        menuName.isEmpty() ? MENU_FORCECLOSE_ITEM_TEXT : menuName,
+        item->getShortcuts().isEmpty()? NULL :
+            new QShortcut(item->getShortcuts().begin().value(), parent),
+        SLOT(slotSystemReset()));
+
+    item->setAction(actionSystemReset);
+}
+
 void ContextMenu::createForceCloseItem(QMenu *menu, MenuItem *item)
 {
     if (menu == NULL || item == NULL) {
@@ -1017,6 +1044,27 @@ void ContextMenu::slotAbout()
 #endif
 }
 
+void ContextMenu::slotDeviceReset()
+{
+    qDebug("System reset request.");
+    qemu_system_reset_request();
+    qDebug("Done for system reset request.");
+}
+
+void ContextMenu::slotSystemReset()
+{
+    qDebug("Reboot.");
+
+    send_shutdown_request(MENU_ACTION_REBOOT);
+
+    qDebug("Sent sync message to emuld.");
+
+    rebootTimer->setInterval(HARDWARE_REBOOT_INTERVAL);
+    rebootTimer->setSingleShot(true);
+    connect(rebootTimer, SIGNAL(timeout()), this, SLOT(slotDeviceReset()));
+    rebootTimer->start();
+}
+
 void ContextMenu::slotForceClose()
 {
     qDebug("force close");
@@ -1090,4 +1138,6 @@ ContextMenu::~ContextMenu()
     delete shellOpener;
 
     longPressTimer->stop();
+
+    rebootTimer->stop();
 }
index 63dc565140ef2aaa0a3e76fc3a5c68b8978b1629..942a077b6760184a82196b2fda0ce6811ed24773 100644 (file)
@@ -49,6 +49,7 @@ extern "C" {
 }
 
 #define CLOSE_POWER_KEY_INTERVAL 1200 /* milli-seconds */
+#define HARDWARE_REBOOT_INTERVAL 1000 /* milli-seconds */
 
 class ContextMenu : public QMenu
 {
@@ -96,6 +97,9 @@ public slots:
     void slotHostKeyboard(bool on);
     void slotAbout();
 
+    void slotSystemReset();
+    void slotDeviceReset();
+
     void slotForceClose();
     void slotClose();
     void slotPwkeyRelease();
@@ -116,6 +120,7 @@ protected:
     void createControlPanelItem(QMenu *menu, MenuItem *item);
     void createScreenShotItem(QMenu *menu, MenuItem *item);
     void createAboutItem(QMenu *menu, MenuItem *item);
+    void createSystemResetItem(QMenu *menu, MenuItem *item);
     void createForceCloseItem(QMenu *menu, MenuItem *item);
     void createCloseItem(QMenu *menu, MenuItem *item);
     bool eventFilter(QObject *obj, QEvent *event);
@@ -146,6 +151,7 @@ private:
     QAction *actionControlPanel;
     QAction *actionScreenShot;
     QAction *actionAbout;
+    QAction *actionSystemReset;
     QAction *actionForceClose;
     QAction *actionClose;
 
@@ -155,5 +161,6 @@ private:
 
     ShellOpener *shellOpener;
     QTimer *longPressTimer;
+    QTimer *rebootTimer;
 };
 #endif // CONTEXTMENU_H
index d271700c3b73a36291926a3a4dc3f984df1e0ea2..0658bea27974728d0429087cfc20ec877fe428b0 100644 (file)
@@ -50,6 +50,7 @@ namespace MenuItemType
         controlPanelItem,
         screenShotItem,
         aboutItem,
+        systemResetItem,
         forceCloseItem,
         closeItem,
     };
diff --git a/tizen/src/ui/resource/icons/system_reset.png b/tizen/src/ui/resource/icons/system_reset.png
new file mode 100644 (file)
index 0000000..bb4e7c2
Binary files /dev/null and b/tizen/src/ui/resource/icons/system_reset.png differ
index 5f009d3405c5d1b2591edb3dd669e2940b905418..7dce5894380a166caf751ac956a665523b1cd754 100644 (file)
@@ -38,6 +38,7 @@
         <file>icons/about.png</file>
         <file>icons/advanced.png</file>
         <file>icons/close.png</file>
+        <file>icons/system_reset.png</file>
         <file>icons/force_close.png</file>
         <file>icons/rotate.png</file>
         <file>icons/scale.png</file>
index 4170bfc7dac114876b5e14d61b1bdecbb7caca4c..dcc709690e75903aacb7fc571177ed41471f1c5f 100644 (file)
             <shortcut>Ctrl+F6</shortcut>
         </controlPanelItem>
         <separator/>
+        <rebootItem name="Reboot">
+            <shortcut>Ctrl+Shift+F4</shortcut>
+        </rebootItem>
         <closeItem name="Close">
             <shortcut>Ctrl+F4</shortcut>
         </closeItem>
index 295b8f178889af59babe2644f737dd0315a6438c..483bdbd946118fc09e05c184c3616ab058626432 100644 (file)
             <shortcut>Ctrl+F6</shortcut>
         </controlPanelItem>
         <separator/>
+        <rebootItem name="Reboot">
+            <shortcut>Ctrl+Shift+F4</shortcut>
+        </rebootItem>
         <closeItem name="Close">
             <shortcut>Ctrl+F4</shortcut>
         </closeItem>
index 09292016acc0424c5f5af4f06316dd2dcbc42b9e..4c01197d787e5bca42d46e4fc4fd994605c22322 100644 (file)
             <shortcut>Ctrl+F6</shortcut>
         </controlPanelItem>
         <separator/>
+        <rebootItem name="Reboot">
+            <shortcut>Ctrl+Shift+F4</shortcut>
+        </rebootItem>
         <closeItem name="Close">
             <shortcut>Ctrl+F4</shortcut>
         </closeItem>
index 39f1eb8d7271f127676451dc9690f9c62138f098..d52af189c8725a9b7dbe5a57e0fd198b3ecc20d3 100644 (file)
             <shortcut>Ctrl+F6</shortcut>
         </controlPanelItem>
         <separator/>
+        <rebootItem name="Reboot">
+            <shortcut>Ctrl+Shift+F4</shortcut>
+        </rebootItem>
         <closeItem name="Close">
             <shortcut>Ctrl+F4</shortcut>
         </closeItem>
index 798cbebc801bfa2498e8426f7bfbca70de5e079f..e9eef246f0051dd3839a66f94ea828e7179124bc 100644 (file)
@@ -72,6 +72,9 @@
             <shortcut>Ctrl+F6</shortcut>
         </controlPanelItem>
         <separator/>
+        <rebootItem name="Reboot">
+            <shortcut>Ctrl+Shift+F4</shortcut>
+        </rebootItem>
         <closeItem name="Close">
             <shortcut>Ctrl+F4</shortcut>
         </closeItem>
index d6e748d7f2eb0261c60df18cf754e2c47942e798..f338dc31130cc54e30f459af2b0f939ada8f52c8 100644 (file)
@@ -55,6 +55,9 @@
             <shortcut>Ctrl+F6</shortcut>
         </controlPanelItem>
         <separator/>
+        <rebootItem name="Reboot">
+            <shortcut>Ctrl+Shift+F4</shortcut>
+        </rebootItem>
         <closeItem name="Close">
             <shortcut>Ctrl+F4</shortcut>
         </closeItem>
index fef73a6848bff46fb568eafe3b02f13fd5c20634..b3811f642622606fb5ecf5e42ce4377d6df52ade 100644 (file)
             <shortcut>Ctrl+F6</shortcut>
         </controlPanelItem>
         <separator/>
+        <rebootItem name="Reboot">
+            <shortcut>Ctrl+Shift+F4</shortcut>
+        </rebootItem>
         <closeItem name="Close">
             <shortcut>Ctrl+F4</shortcut>
         </closeItem>
index c6723b9665fc3a8f78d9657dbbe3f54cc8d63e2a..73e25c336cff207eef84c2ae6d69daf89eff5628 100644 (file)
             <shortcut>Ctrl+F6</shortcut>
         </controlPanelItem>
         <separator/>
+        <rebootItem name="Reboot">
+            <shortcut>Ctrl+Shift+F4</shortcut>
+        </rebootItem>
         <closeItem name="Close">
             <shortcut>Ctrl+F4</shortcut>
         </closeItem>
index 6f1d496a5db16a80f2d9310f57827d63c3fd8c92..51812753cd722ea5b973cf8bb98f2bce1c7e0ac0 100644 (file)
             <shortcut>Ctrl+F6</shortcut>
         </controlPanelItem>
         <separator/>
+        <rebootItem name="Reboot">
+            <shortcut>Ctrl+Shift+F4</shortcut>
+        </rebootItem>
         <closeItem name="Close">
             <shortcut>Ctrl+F4</shortcut>
         </closeItem>
index e14fa3429e448174e9d8da1734d63180b382b7c1..15803d10db42990da32b9afae9086b44651997de 100644 (file)
@@ -62,6 +62,9 @@
             <shortcut>Ctrl+F6</shortcut>
         </controlPanelItem>
         <separator/>
+        <rebootItem name="Reboot">
+            <shortcut>Ctrl+Shift+F4</shortcut>
+        </rebootItem>
         <closeItem name="Close">
             <shortcut>Ctrl+F4</shortcut>
         </closeItem>
index cb9cbe2b51b56be4a14cc18b22991cf67ec59fb3..2f60964fd11b0c7bbc1baa43d31d95503dcda16f 100644 (file)
             <shortcut>Ctrl+F6</shortcut>
         </controlPanelItem>
         <separator/>
+        <rebootItem name="Reboot">
+            <shortcut>Ctrl+Shift+F4</shortcut>
+        </rebootItem>
         <closeItem name="Close">
             <shortcut>Ctrl+F4</shortcut>
         </closeItem>
index 9021a696c1f872f302123d43cb0e536abaaf8958..67094fdcb379f644234a4203253e899a5c3a4130 100644 (file)
             <shortcut>Ctrl+F6</shortcut>
         </controlPanelItem>
         <separator/>
+        <rebootItem name="Reboot">
+            <shortcut>Ctrl+Shift+F4</shortcut>
+        </rebootItem>
         <closeItem name="Close">
             <shortcut>Ctrl+F4</shortcut>
         </closeItem>
index 996ed5ed325f726d967f08985779fa193ee1022d..f8d2e1071353cfe2969c48e5d1db92b95fb374f3 100644 (file)
@@ -79,6 +79,7 @@
 #define ECP_MENU_KEYWORD "controlPanelItem"
 #define SCREENSHOT_MENU_KEYWORD "screenShotItem"
 #define ABOUT_MENU_KEYWORD "aboutItem"
+#define SYSTEM_RESET_MENU_KEYWORD "rebootItem"
 #define FORCECLOSE_MENU_KEYWORD "forceCloseItem"
 #define CLOSE_MENU_KEYWORD "closeItem"
 
index 2b016ecacb6fcd9023a42eaeb392396254b41730..483afbbcd642557cded44b0b78a25bd1c99b53bc 100644 (file)
@@ -502,6 +502,8 @@ int XmlLayoutParser::parseMenuList(
                 item = parseGeneralMenuItem(xml, MenuItemType::screenShotItem);
             } else if (xml.name() == ABOUT_MENU_KEYWORD) {
                 item = parseGeneralMenuItem(xml, MenuItemType::aboutItem);
+            } else if (xml.name() == SYSTEM_RESET_MENU_KEYWORD) {
+                item = parseGeneralMenuItem(xml, MenuItemType::systemResetItem);
             } else if (xml.name() == FORCECLOSE_MENU_KEYWORD) {
                 item = parseGeneralMenuItem(xml, MenuItemType::forceCloseItem);
             } else if (xml.name() == CLOSE_MENU_KEYWORD) {