diff options
author | Tadao Tanikawa <tanikawa.tadao@jp.panasonic.com> | 2017-04-26 19:30:14 +0900 |
---|---|---|
committer | Tadao Tanikawa <tanikawa.tadao@jp.panasonic.com> | 2017-04-26 19:32:30 +0900 |
commit | 8539198ad9a90ca2cb004fbdfcddb732ae751926 (patch) | |
tree | b621eff355985e6ef284a846b9b082ccb2911699 | |
parent | bee2dce0697da156903c55523e1e869aa33f4964 (diff) |
Fix issue of media player which doesn't play next while background
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.
This commit is modification of recipe for homescreen which
contains 1 patch file to 'staging/HomeScreen' because
it is already locked (It is splitted new repositories
but chinook doesn't use it).
Bug-AGL: SPEC-395
Change-Id: I4b1ed16c5d20ccab9a1a2aa55e463d0141d3a170
Signed-off-by: Tadao Tanikawa <tanikawa.tadao@jp.panasonic.com>
-rw-r--r-- | recipes-demo-hmi/homescreen/homescreen/0001-Hack-to-resolve-the-media-player-doesn-t-play-next.patch | 396 | ||||
-rw-r--r-- | recipes-demo-hmi/homescreen/homescreen_git.bb | 1 |
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<int>"/> ++ <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QList<int>"/> + </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}" |