aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--recipes-demo-hmi/homescreen/homescreen/0001-Hack-to-resolve-the-media-player-doesn-t-play-next.patch396
-rw-r--r--recipes-demo-hmi/homescreen/homescreen_git.bb1
2 files changed, 397 insertions, 0 deletions
diff --git a/recipes-demo-hmi/homescreen/homescreen/0001-Hack-to-resolve-the-media-player-doesn-t-play-next.patch b/recipes-demo-hmi/homescreen/homescreen/0001-Hack-to-resolve-the-media-player-doesn-t-play-next.patch
new file mode 100644
index 000000000..f6eda81d4
--- /dev/null
+++ b/recipes-demo-hmi/homescreen/homescreen/0001-Hack-to-resolve-the-media-player-doesn-t-play-next.patch
@@ -0,0 +1,396 @@
+From 8fcc04ebda417fae3bd8e8300db6d48e71b0ff16 Mon Sep 17 00:00:00 2001
+From: Tadao Tanikawa <tanikawa.tadao@jp.panasonic.com>
+Date: Tue, 18 Apr 2017 18:32:15 +0900
+Subject: [PATCH] Hack to resolve the media player doesn't play next
+
+Current window manager make own ivi-layer to each application
+and adjust the order when rendering (screen's render order of
+layers).
+
+E.g. When showing apps launcher, window manager has only 1
+ivi-layer for homescreen under screen 0. When showing an app,
+window manager add 1 ivi-layer for it and set render order
+of 2 layers, front: app's and back: homescreen layer.
+And when app hides, it's layer is removed from render order.
+
+But if removed from render order, excecuting QML also stopped.
+It is caused why the media player doesn't play next song
+when it is not shown.
+
+This patch changes how to make render order to keep media
+player's layer in render order even when it is not shown.
+
+Change-Id: I4f27a77789733987b8b92f068946cb64e9654901
+Signed-off-by: Tadao Tanikawa <tanikawa.tadao@jp.panasonic.com>
+---
+ HomeScreen/qml/Home.qml | 2 +-
+ HomeScreen/qml/ShortcutArea.qml | 2 +-
+ HomeScreen/src/layouthandler.cpp | 5 +-
+ HomeScreen/src/layouthandler.h | 2 +-
+ WindowManager/src/windowmanager.cpp | 123 ++++++++++++++++++++++++++++--------
+ WindowManager/src/windowmanager.hpp | 14 +++-
+ interfaces/windowmanager.xml | 4 +-
+ 7 files changed, 116 insertions(+), 36 deletions(-)
+
+diff --git a/HomeScreen/qml/Home.qml b/HomeScreen/qml/Home.qml
+index aa3a129..33b958e 100644
+--- a/HomeScreen/qml/Home.qml
++++ b/HomeScreen/qml/Home.qml
+@@ -54,7 +54,7 @@ Item {
+
+ applicationArea.visible = true
+ appLauncherAreaLauncher.visible = false
+- layoutHandler.showAppLayer(pid)
++ layoutHandler.showAppLayer(model.id, pid)
+ }
+ else {
+ console.warn("app cannot be launched!")
+diff --git a/HomeScreen/qml/ShortcutArea.qml b/HomeScreen/qml/ShortcutArea.qml
+index 14c7b6b..9be3fd0 100644
+--- a/HomeScreen/qml/ShortcutArea.qml
++++ b/HomeScreen/qml/ShortcutArea.qml
+@@ -69,7 +69,7 @@ Item {
+ applicationArea.visible = true
+ appLauncherAreaLauncher.visible = false
+ layoutHandler.makeMeVisible(pid)
+- layoutHandler.showAppLayer(pid)
++ layoutHandler.showAppLayer(model.application, pid)
+ }
+ else {
+ console.warn("app cannot be launched!")
+diff --git a/HomeScreen/src/layouthandler.cpp b/HomeScreen/src/layouthandler.cpp
+index c0fa620..b91984d 100644
+--- a/HomeScreen/src/layouthandler.cpp
++++ b/HomeScreen/src/layouthandler.cpp
+@@ -86,9 +86,9 @@ LayoutHandler::~LayoutHandler()
+ delete mp_dBusWindowManagerProxy;
+ }
+
+-void LayoutHandler::showAppLayer(int pid)
++void LayoutHandler::showAppLayer(const QString &app_id, int pid)
+ {
+- mp_dBusWindowManagerProxy->showAppLayer(pid);
++ mp_dBusWindowManagerProxy->showAppLayer(app_id, pid);
+ }
+
+ void LayoutHandler::hideAppLayer()
+@@ -275,4 +275,3 @@ void LayoutHandler::timerEvent(QTimerEvent *e)
+ checkToDoQueue();
+ }
+ }
+-
+diff --git a/HomeScreen/src/layouthandler.h b/HomeScreen/src/layouthandler.h
+index c82bfda..007f1ad 100644
+--- a/HomeScreen/src/layouthandler.h
++++ b/HomeScreen/src/layouthandler.h
+@@ -31,7 +31,7 @@ public:
+ signals:
+
+ public slots:
+- void showAppLayer(int pid);
++ void showAppLayer(const QString &app_id, int pid);
+ void hideAppLayer();
+ void makeMeVisible(int pid);
+ private:
+diff --git a/WindowManager/src/windowmanager.cpp b/WindowManager/src/windowmanager.cpp
+index e7802ca..02bc392 100644
+--- a/WindowManager/src/windowmanager.cpp
++++ b/WindowManager/src/windowmanager.cpp
+@@ -51,7 +51,7 @@ void* WindowManager::myThis = 0;
+ WindowManager::WindowManager(int displayId, QObject *parent) :
+ QObject(parent),
+ m_layouts(),
+- mp_layoutAreaToSurfaceIdAssignment(0),
++ // mp_layoutAreaToSurfaceIdAssignmment(0),
+ m_currentLayout(-1),
+ m_screenId(displayId),
+ m_screenWidth(0),
+@@ -60,6 +60,8 @@ WindowManager::WindowManager(int displayId, QObject *parent) :
+ ,
+ m_appSurfaces(),
+ m_appLayers(),
++ m_keepApps(),
++ m_bgApps(),
+ m_pending_to_show(-1)
+ #endif
+ {
+@@ -71,6 +73,7 @@ WindowManager::WindowManager(int displayId, QObject *parent) :
+ m_showLayers[2] = 0; /* APPLICATIONS is not shown by default */
+ m_showLayers[3] = WINDOWMANAGER_LAYER_HOMESCREEN; /* HOMESCREEN is shwon by default */
+
++ m_keepApps.append(QString("mediaplayer@"));
+ #endif
+ qDebug("-=[WindowManager]=-");
+ }
+@@ -120,17 +123,36 @@ WindowManager::~WindowManager()
+ }
+
+ #ifdef HAVE_IVI_LAYERMANAGEMENT_API
+-int WindowManager::getLayerRenderOrder(t_ilm_layer id_array[])
++t_ilm_layer* WindowManager::getLayerRenderOrder(int& num_layers)
+ {
+- int i, j;
++ int i, j, n_bg = m_bgApps.size();
+
+- for (i = WINDOWMANAGER_LAYER_NUM - 1, j = 0; i >= 0; i--) {
++ t_ilm_layer* id_array = new t_ilm_layer[n_bg + WINDOWMANAGER_LAYER_NUM];
++
++ qDebug("Layer render order (ivi-layer-id), %d bgApps: ", n_bg);
++
++ num_layers = 0;
++ for (i = 0; i < n_bg; i++) {
++ if (m_bgApps[i] != 0) {
++ QMap<pid_t, t_ilm_layer>::const_iterator i_layers;
++ i_layers = m_appLayers.find(m_bgApps[i]);
++ /* m_showLayers[2] means layer for apps */
++ if (i_layers != m_appLayers.end() && i_layers.value() != 0
++ && i_layers.value() != m_showLayers[2]) {
++ qDebug(" m_bgApps[%d]=%d", i, i_layers.value());
++ id_array[num_layers++] = i_layers.value();
++ }
++ }
++ }
++
++ for (i = WINDOWMANAGER_LAYER_NUM - 1, j = 0; i >= 0; i--,j++) {
+ if (m_showLayers[i] != 0) {
+- id_array[j++] = m_showLayers[i];
++ qDebug(" m_showLayers[%d]=%d", i, m_showLayers[i]);
++ id_array[num_layers++] = m_showLayers[i];
+ }
+ }
+
+- return j;
++ return id_array;
+ }
+ #endif
+
+@@ -401,13 +423,12 @@ void WindowManager::updateScreen()
+ #endif
+ #ifdef HAVE_IVI_LAYERMANAGEMENT_API
+ if (m_pending_to_show != -1) {
+- qDebug("show pending app (%d)", m_pending_to_show);
++ qDebug() << "show pending app (%d)" << m_pending_to_show;
+ showAppLayer(m_pending_to_show);
+ } else {
+ // display layer render order
+- t_ilm_layer renderOrder[WINDOWMANAGER_LAYER_NUM];
+- int num_layers = getLayerRenderOrder(renderOrder);
+-
++ int num_layers;
++ t_ilm_layer *renderOrder = getLayerRenderOrder(num_layers);
+ qDebug("Screen render order %d, %d layers", m_screenId, num_layers);
+ ilm_displaySetRenderOrder(m_screenId, renderOrder, num_layers);
+ ilm_commitChanges();
+@@ -686,6 +707,18 @@ QString WindowManager::getLayoutName(int layoutId)
+ return result;
+ }
+
++#ifdef HAVE_IVI_LAYERMANAGEMENT_API
++void WindowManager::renderLayers(void)
++{
++ int num_layers;
++ t_ilm_layer *renderOrder = getLayerRenderOrder(num_layers);
++
++ qDebug("Screen render order %d, %d layers", m_screenId, num_layers);
++ ilm_displaySetRenderOrder(m_screenId, renderOrder, num_layers);
++ ilm_commitChanges();
++}
++#endif
++
+ void WindowManager::hideLayer(int layer)
+ {
+ qDebug("-=[hideLayer]=-");
+@@ -701,10 +734,7 @@ void WindowManager::hideLayer(int layer)
+ m_pending_to_show = -1;
+ }
+
+- t_ilm_layer renderOrder[WINDOWMANAGER_LAYER_NUM];
+- int num_layers = getLayerRenderOrder(renderOrder);
+- ilm_displaySetRenderOrder(m_screenId, renderOrder, num_layers);
+- ilm_commitChanges();
++ renderLayers();
+ }
+ #endif
+ }
+@@ -779,10 +809,7 @@ void WindowManager::showLayer(int layer)
+
+ m_showLayers[layer] = layer_id_array[layer];
+
+- t_ilm_layer renderOrder[WINDOWMANAGER_LAYER_NUM];
+- int num_layers = getLayerRenderOrder(renderOrder);
+- ilm_displaySetRenderOrder(m_screenId, renderOrder, num_layers);
+- ilm_commitChanges();
++ renderLayers();
+ }
+ #endif
+ }
+@@ -790,7 +817,7 @@ void WindowManager::showLayer(int layer)
+ void WindowManager::showAppLayer(int pid)
+ {
+ qDebug("-=[showAppLayer]=-");
+- qDebug("pid %d", pid);
++ qDebug() << "pid=" << pid;
+
+ if (pid == -1) {
+ /* nothing to show */
+@@ -802,17 +829,65 @@ void WindowManager::showAppLayer(int pid)
+
+ /* search layer id for application to show */
+ QMap<pid_t, t_ilm_layer>::const_iterator i = m_appLayers.find(pid);
+- QMap<pid_t, t_ilm_surface>::const_iterator j = m_appSurfaces.find(pid);
+
+ if (i != m_appLayers.end()) {
++ qDebug("Found layer(%d) to show for app(pid=%d)", m_showLayers[2], pid);
+ m_showLayers[2] = i.value();
++ } else {
++ QMap<pid_t, t_ilm_surface>::const_iterator j = m_appSurfaces.find(pid);
++ /* check if this app is registered */
++ if (j == m_appSurfaces.end()) {
++ qDebug("New app %d", pid);
++ m_appSurfaces.insert(pid, 0); /* register pid only so far */
++ } /* check app is required keep running while background */
++
++ /* Probably app layer hasn't been made yet */
++ m_pending_to_show = pid;
++ /* hide current app once, back to default screen */
++ m_showLayers[2] = 0;
++ qDebug("No layer to show for app(pid=%d)", pid);
++ }
++ renderLayers();
++#endif
++}
++
++void WindowManager::showAppLayer(const QString &app_id, int pid)
++{
++ qDebug("-=[showAppLayer]=-");
++ qDebug() << "id=" << app_id << ", pid=" << pid;
++
++ if (pid == -1) {
++ /* nothing to show */
++ return;
++ }
++#ifdef HAVE_IVI_LAYERMANAGEMENT_API
++ /* clear pending flag */
++ m_pending_to_show = -1;
++
++ /* search layer id for application to show */
++ QMap<pid_t, t_ilm_layer>::const_iterator i = m_appLayers.find(pid);
++
++ if (i != m_appLayers.end()) {
+ qDebug("Found layer(%d) to show for app(pid=%d)", m_showLayers[2], pid);
++ m_showLayers[2] = i.value();
+ } else {
++ QMap<pid_t, t_ilm_surface>::const_iterator j = m_appSurfaces.find(pid);
+ /* check if this app is registered */
+ if (j == m_appSurfaces.end()) {
+ qDebug("New app %d", pid);
+ m_appSurfaces.insert(pid, 0); /* register pid only so far */
+- }
++
++ /* check if rendering is always required */
++ /* QML apps should be always rendered if */
++ for (int k = 0; k != m_keepApps.size(); k++) {
++ if (app_id.indexOf(m_keepApps[k]) == 0) {
++ int idx = m_bgApps.indexOf(pid);
++ if (idx == -1) {
++ m_bgApps.append(pid);
++ }
++ }
++ }
++ } /* check app is required keep running while background */
+
+ /* Probably app layer hasn't been made yet */
+ m_pending_to_show = pid;
+@@ -820,10 +895,6 @@ void WindowManager::showAppLayer(int pid)
+ m_showLayers[2] = 0;
+ qDebug("No layer to show for app(pid=%d)", pid);
+ }
+- t_ilm_layer renderOrder[WINDOWMANAGER_LAYER_NUM];
+-
+- int num_layers = getLayerRenderOrder(renderOrder);
+- ilm_displaySetRenderOrder(m_screenId, renderOrder, num_layers);
+- ilm_commitChanges();
++ renderLayers();
+ #endif
+ }
+diff --git a/WindowManager/src/windowmanager.hpp b/WindowManager/src/windowmanager.hpp
+index 89f255e..532bf80 100644
+--- a/WindowManager/src/windowmanager.hpp
++++ b/WindowManager/src/windowmanager.hpp
+@@ -25,6 +25,7 @@
+
+ #ifdef HAVE_IVI_LAYERMANAGEMENT_API
+ #include <ilm/ilm_control.h>
++#include <vector>
+ #endif
+ class WindowManager : public QObject
+ {
+@@ -50,9 +51,14 @@ private:
+
+ #ifdef HAVE_IVI_LAYERMANAGEMENT_API
+ t_ilm_layer* m_showLayers;
++
+ QMap<pid_t, t_ilm_surface> m_appSurfaces;
+ QMap<pid_t, t_ilm_layer> m_appLayers;
+- int getLayerRenderOrder(t_ilm_layer* id_array);
++
++ QList<QString> m_keepApps; /* Apps needs to keep rendering */
++ QList<pid_t> m_bgApps;
++
++ t_ilm_layer* getLayerRenderOrder(int& num_layers);
+
+ void createNewLayer(const int layerId);
+
+@@ -61,11 +67,14 @@ private:
+ pid_t m_pending_to_show;
+
+ void addSurface(const t_ilm_surface surfaceId);
+- t_ilm_layer addSurfaceToAppLayer(pid_t pid, const int surfaceId);
++
++ t_ilm_layer addSurfaceToAppLayer(pid_t pid, const int surfaceId);
+ void addSurfaceToLayer(const int surfaceId, const int layerId);
+
+ void configureHomeScreenMainSurface(const t_ilm_surface surface, const t_ilm_int width, const t_ilm_int height);
+ void configureAppSurface(const pid_t pid, const t_ilm_surface surface, const t_ilm_int width, const t_ilm_int height);
++
++ void renderLayers(void);
+ #endif
+ void updateScreen();
+
+@@ -118,6 +127,7 @@ public Q_SLOTS: // METHODS
+ int setSurfaceToLayoutArea(int surfaceId, int layoutAreaId);
+ void showLayer(int layer);
+ void showAppLayer(int pid);
++ void showAppLayer(const QString &app_id, int pid);
+
+ Q_SIGNALS: // SIGNALS
+ void surfaceVisibilityChanged(int surfaceId, bool visible);
+diff --git a/interfaces/windowmanager.xml b/interfaces/windowmanager.xml
+index e3c6df3..9d8cafc 100644
+--- a/interfaces/windowmanager.xml
++++ b/interfaces/windowmanager.xml
+@@ -157,7 +157,7 @@
+ -->
+ <method name="getAvailableSurfaces">
+ <arg name="surfaceIds" type="a(i)" direction="out"/>
+- <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QList&lt;int&gt;"/>
++ <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QList&lt;int&gt;"/>
+ </method>
+
+ <!--
+@@ -191,6 +191,7 @@
+ Show layer for application .
+ -->
+ <method name="showAppLayer">
++ <arg name="name" type="s" direction="in"/>
+ <arg name="pid" type="i" direction="in"/>
+ </method>
+ <!--
+@@ -205,4 +206,3 @@
+ </method>
+ </interface>
+ </node>
+-
+--
+2.7.4
+
diff --git a/recipes-demo-hmi/homescreen/homescreen_git.bb b/recipes-demo-hmi/homescreen/homescreen_git.bb
index 76e5ff2a1..e871e31ce 100644
--- a/recipes-demo-hmi/homescreen/homescreen_git.bb
+++ b/recipes-demo-hmi/homescreen/homescreen_git.bb
@@ -8,6 +8,7 @@ LIC_FILES_CHKSUM = "file://HomeScreen/LICENSE;md5=ae6497158920d9524cf208c09cc4c9
SRC_URI = "git://gerrit.automotivelinux.org/gerrit/p/staging/HomeScreen.git;protocol=http \
+ file://0001-Hack-to-resolve-the-media-player-doesn-t-play-next.patch \
file://homescreen.pc.in \
file://dbus-homescreen.conf.in"
SRCREV = "${AUTOREV}"