Fix issue of media player which doesn't play next while background
[AGL/meta-agl-demo.git] / recipes-demo-hmi / homescreen / homescreen / 0001-Hack-to-resolve-the-media-player-doesn-t-play-next.patch
1 From 8fcc04ebda417fae3bd8e8300db6d48e71b0ff16 Mon Sep 17 00:00:00 2001
2 From: Tadao Tanikawa <tanikawa.tadao@jp.panasonic.com>
3 Date: Tue, 18 Apr 2017 18:32:15 +0900
4 Subject: [PATCH] Hack to resolve the media player doesn't play next
5
6 Current window manager make own ivi-layer to each application
7 and adjust the order when rendering (screen's render order of
8 layers).
9
10 E.g. When showing apps launcher, window manager has only 1
11 ivi-layer for homescreen under screen 0. When showing an app,
12 window manager add 1 ivi-layer for it and set render order
13 of 2 layers, front: app's and back: homescreen layer.
14 And when app hides, it's layer is removed from render order.
15
16 But if removed from render order, excecuting QML also stopped.
17 It is caused why the media player doesn't play next song
18 when it is not shown.
19
20 This patch changes how to make render order to keep media
21 player's layer in render order even when it is not shown.
22
23 Change-Id: I4f27a77789733987b8b92f068946cb64e9654901
24 Signed-off-by: Tadao Tanikawa <tanikawa.tadao@jp.panasonic.com>
25 ---
26  HomeScreen/qml/Home.qml             |   2 +-
27  HomeScreen/qml/ShortcutArea.qml     |   2 +-
28  HomeScreen/src/layouthandler.cpp    |   5 +-
29  HomeScreen/src/layouthandler.h      |   2 +-
30  WindowManager/src/windowmanager.cpp | 123 ++++++++++++++++++++++++++++--------
31  WindowManager/src/windowmanager.hpp |  14 +++-
32  interfaces/windowmanager.xml        |   4 +-
33  7 files changed, 116 insertions(+), 36 deletions(-)
34
35 diff --git a/HomeScreen/qml/Home.qml b/HomeScreen/qml/Home.qml
36 index aa3a129..33b958e 100644
37 --- a/HomeScreen/qml/Home.qml
38 +++ b/HomeScreen/qml/Home.qml
39 @@ -54,7 +54,7 @@ Item {
40  
41                      applicationArea.visible = true
42                      appLauncherAreaLauncher.visible = false
43 -                    layoutHandler.showAppLayer(pid)
44 +                    layoutHandler.showAppLayer(model.id, pid)
45                  }
46                  else {
47                      console.warn("app cannot be launched!")
48 diff --git a/HomeScreen/qml/ShortcutArea.qml b/HomeScreen/qml/ShortcutArea.qml
49 index 14c7b6b..9be3fd0 100644
50 --- a/HomeScreen/qml/ShortcutArea.qml
51 +++ b/HomeScreen/qml/ShortcutArea.qml
52 @@ -69,7 +69,7 @@ Item {
53                              applicationArea.visible = true
54                              appLauncherAreaLauncher.visible = false
55                              layoutHandler.makeMeVisible(pid)
56 -                            layoutHandler.showAppLayer(pid)
57 +                            layoutHandler.showAppLayer(model.application, pid)
58                          }
59                          else {
60                              console.warn("app cannot be launched!")
61 diff --git a/HomeScreen/src/layouthandler.cpp b/HomeScreen/src/layouthandler.cpp
62 index c0fa620..b91984d 100644
63 --- a/HomeScreen/src/layouthandler.cpp
64 +++ b/HomeScreen/src/layouthandler.cpp
65 @@ -86,9 +86,9 @@ LayoutHandler::~LayoutHandler()
66      delete mp_dBusWindowManagerProxy;
67  }
68  
69 -void LayoutHandler::showAppLayer(int pid)
70 +void LayoutHandler::showAppLayer(const QString &app_id, int pid)
71  {
72 -    mp_dBusWindowManagerProxy->showAppLayer(pid);
73 +    mp_dBusWindowManagerProxy->showAppLayer(app_id, pid);
74  }
75  
76  void LayoutHandler::hideAppLayer()
77 @@ -275,4 +275,3 @@ void LayoutHandler::timerEvent(QTimerEvent *e)
78          checkToDoQueue();
79      }
80  }
81 -
82 diff --git a/HomeScreen/src/layouthandler.h b/HomeScreen/src/layouthandler.h
83 index c82bfda..007f1ad 100644
84 --- a/HomeScreen/src/layouthandler.h
85 +++ b/HomeScreen/src/layouthandler.h
86 @@ -31,7 +31,7 @@ public:
87  signals:
88  
89  public slots:
90 -    void showAppLayer(int pid);
91 +    void showAppLayer(const QString &app_id, int pid);
92      void hideAppLayer();
93      void makeMeVisible(int pid);
94  private:
95 diff --git a/WindowManager/src/windowmanager.cpp b/WindowManager/src/windowmanager.cpp
96 index e7802ca..02bc392 100644
97 --- a/WindowManager/src/windowmanager.cpp
98 +++ b/WindowManager/src/windowmanager.cpp
99 @@ -51,7 +51,7 @@ void* WindowManager::myThis = 0;
100  WindowManager::WindowManager(int displayId, QObject *parent) :
101      QObject(parent),
102      m_layouts(),
103 -    mp_layoutAreaToSurfaceIdAssignment(0),
104 +    // mp_layoutAreaToSurfaceIdAssignmment(0),
105      m_currentLayout(-1),
106      m_screenId(displayId),
107      m_screenWidth(0),
108 @@ -60,6 +60,8 @@ WindowManager::WindowManager(int displayId, QObject *parent) :
109      ,
110      m_appSurfaces(),
111      m_appLayers(),
112 +    m_keepApps(),
113 +    m_bgApps(),
114      m_pending_to_show(-1)
115  #endif
116  {
117 @@ -71,6 +73,7 @@ WindowManager::WindowManager(int displayId, QObject *parent) :
118      m_showLayers[2] = 0; /* APPLICATIONS is not shown by default */
119      m_showLayers[3] = WINDOWMANAGER_LAYER_HOMESCREEN; /* HOMESCREEN is shwon by default */
120  
121 +    m_keepApps.append(QString("mediaplayer@"));
122  #endif
123      qDebug("-=[WindowManager]=-");
124  }
125 @@ -120,17 +123,36 @@ WindowManager::~WindowManager()
126  }
127  
128  #ifdef HAVE_IVI_LAYERMANAGEMENT_API
129 -int WindowManager::getLayerRenderOrder(t_ilm_layer id_array[])
130 +t_ilm_layer* WindowManager::getLayerRenderOrder(int& num_layers)
131  {
132 -    int i, j;
133 +    int i, j, n_bg = m_bgApps.size();
134  
135 -    for (i = WINDOWMANAGER_LAYER_NUM - 1, j = 0; i >= 0; i--) {
136 +    t_ilm_layer* id_array = new t_ilm_layer[n_bg + WINDOWMANAGER_LAYER_NUM];
137 +
138 +    qDebug("Layer render order (ivi-layer-id), %d bgApps: ", n_bg);
139 +
140 +    num_layers = 0;
141 +    for (i = 0; i < n_bg; i++) {
142 +        if (m_bgApps[i] != 0) {
143 +            QMap<pid_t, t_ilm_layer>::const_iterator i_layers;
144 +            i_layers = m_appLayers.find(m_bgApps[i]);
145 +            /* m_showLayers[2] means layer for apps */
146 +            if (i_layers != m_appLayers.end() && i_layers.value() != 0
147 +                && i_layers.value() != m_showLayers[2]) {
148 +                qDebug("  m_bgApps[%d]=%d", i, i_layers.value());
149 +                id_array[num_layers++] = i_layers.value();
150 +            }
151 +        }
152 +    }
153 +
154 +    for (i = WINDOWMANAGER_LAYER_NUM - 1, j = 0; i >= 0; i--,j++) {
155          if (m_showLayers[i] != 0) {
156 -            id_array[j++] = m_showLayers[i];
157 +            qDebug("  m_showLayers[%d]=%d", i, m_showLayers[i]);
158 +            id_array[num_layers++] = m_showLayers[i];
159          }
160      }
161  
162 -    return j;
163 +    return id_array;
164  }
165  #endif
166  
167 @@ -401,13 +423,12 @@ void WindowManager::updateScreen()
168  #endif
169  #ifdef HAVE_IVI_LAYERMANAGEMENT_API
170      if (m_pending_to_show != -1) {
171 -        qDebug("show pending app (%d)", m_pending_to_show);
172 +        qDebug() << "show pending app (%d)" << m_pending_to_show;
173          showAppLayer(m_pending_to_show);
174      } else {
175          // display layer render order
176 -        t_ilm_layer renderOrder[WINDOWMANAGER_LAYER_NUM];
177 -        int num_layers = getLayerRenderOrder(renderOrder);
178 -
179 +        int num_layers;
180 +        t_ilm_layer *renderOrder = getLayerRenderOrder(num_layers);
181          qDebug("Screen render order %d, %d layers", m_screenId, num_layers);
182          ilm_displaySetRenderOrder(m_screenId, renderOrder, num_layers);
183          ilm_commitChanges();
184 @@ -686,6 +707,18 @@ QString WindowManager::getLayoutName(int layoutId)
185      return result;
186  }
187  
188 +#ifdef HAVE_IVI_LAYERMANAGEMENT_API
189 +void WindowManager::renderLayers(void)
190 +{
191 +    int num_layers;
192 +    t_ilm_layer *renderOrder = getLayerRenderOrder(num_layers);
193 +
194 +    qDebug("Screen render order %d, %d layers", m_screenId, num_layers);
195 +    ilm_displaySetRenderOrder(m_screenId, renderOrder, num_layers);
196 +    ilm_commitChanges();
197 +}
198 +#endif
199 +
200  void WindowManager::hideLayer(int layer)
201  {
202      qDebug("-=[hideLayer]=-");
203 @@ -701,10 +734,7 @@ void WindowManager::hideLayer(int layer)
204              m_pending_to_show = -1;
205          }
206  
207 -        t_ilm_layer renderOrder[WINDOWMANAGER_LAYER_NUM];
208 -        int num_layers = getLayerRenderOrder(renderOrder);
209 -        ilm_displaySetRenderOrder(m_screenId, renderOrder, num_layers);
210 -        ilm_commitChanges();
211 +        renderLayers();
212      }
213  #endif
214  }
215 @@ -779,10 +809,7 @@ void WindowManager::showLayer(int layer)
216  
217          m_showLayers[layer] = layer_id_array[layer];
218  
219 -        t_ilm_layer renderOrder[WINDOWMANAGER_LAYER_NUM];
220 -        int num_layers = getLayerRenderOrder(renderOrder);
221 -        ilm_displaySetRenderOrder(m_screenId, renderOrder, num_layers);
222 -        ilm_commitChanges();
223 +        renderLayers();
224      }
225  #endif
226  }
227 @@ -790,7 +817,7 @@ void WindowManager::showLayer(int layer)
228  void WindowManager::showAppLayer(int pid)
229  {
230      qDebug("-=[showAppLayer]=-");
231 -    qDebug("pid %d", pid);
232 +    qDebug() << "pid=" << pid;
233  
234      if (pid == -1) {
235          /* nothing to show */
236 @@ -802,17 +829,65 @@ void WindowManager::showAppLayer(int pid)
237  
238      /* search layer id for application to show */
239      QMap<pid_t, t_ilm_layer>::const_iterator i = m_appLayers.find(pid);
240 -    QMap<pid_t, t_ilm_surface>::const_iterator j = m_appSurfaces.find(pid);
241  
242      if (i != m_appLayers.end()) {
243 +        qDebug("Found layer(%d) to show for app(pid=%d)", m_showLayers[2], pid);
244          m_showLayers[2] = i.value();
245 +    } else {
246 +        QMap<pid_t, t_ilm_surface>::const_iterator j = m_appSurfaces.find(pid);
247 +        /* check if this app is registered */
248 +        if (j == m_appSurfaces.end()) {
249 +            qDebug("New app %d", pid);
250 +            m_appSurfaces.insert(pid, 0); /* register pid only so far */
251 +        } /* check app is required keep running while background */
252 +
253 +          /* Probably app layer hasn't been made yet */
254 +          m_pending_to_show = pid;
255 +          /* hide current app once, back to default screen */
256 +          m_showLayers[2] = 0;
257 +          qDebug("No layer to show for app(pid=%d)", pid);
258 +    }
259 +    renderLayers();
260 +#endif
261 +}
262 +
263 +void WindowManager::showAppLayer(const QString &app_id, int pid)
264 +{
265 +    qDebug("-=[showAppLayer]=-");
266 +    qDebug() << "id=" << app_id << ", pid=" << pid;
267 +
268 +    if (pid == -1) {
269 +        /* nothing to show */
270 +        return;
271 +    }
272 +#ifdef HAVE_IVI_LAYERMANAGEMENT_API
273 +    /* clear pending flag */
274 +    m_pending_to_show = -1;
275 +
276 +    /* search layer id for application to show */
277 +    QMap<pid_t, t_ilm_layer>::const_iterator i = m_appLayers.find(pid);
278 +
279 +    if (i != m_appLayers.end()) {
280          qDebug("Found layer(%d) to show for app(pid=%d)", m_showLayers[2], pid);
281 +        m_showLayers[2] = i.value();
282      } else {
283 +        QMap<pid_t, t_ilm_surface>::const_iterator j = m_appSurfaces.find(pid);
284          /* check if this app is registered */
285          if (j == m_appSurfaces.end()) {
286              qDebug("New app %d", pid);
287              m_appSurfaces.insert(pid, 0); /* register pid only so far */
288 -        }
289 +
290 +            /* check if rendering is always required */
291 +            /* QML apps should be always rendered if */
292 +            for (int k = 0; k != m_keepApps.size(); k++) {
293 +                if (app_id.indexOf(m_keepApps[k]) == 0) {
294 +                    int idx = m_bgApps.indexOf(pid);
295 +                    if (idx == -1) {
296 +                        m_bgApps.append(pid);
297 +                    }
298 +                }
299 +            }
300 +        } /* check app is required keep running while background */
301  
302          /* Probably app layer hasn't been made yet */
303          m_pending_to_show = pid;
304 @@ -820,10 +895,6 @@ void WindowManager::showAppLayer(int pid)
305          m_showLayers[2] = 0;
306          qDebug("No layer to show for app(pid=%d)", pid);
307      }
308 -    t_ilm_layer renderOrder[WINDOWMANAGER_LAYER_NUM];
309 -
310 -    int num_layers = getLayerRenderOrder(renderOrder);
311 -    ilm_displaySetRenderOrder(m_screenId, renderOrder, num_layers);
312 -    ilm_commitChanges();
313 +    renderLayers();
314  #endif
315  }
316 diff --git a/WindowManager/src/windowmanager.hpp b/WindowManager/src/windowmanager.hpp
317 index 89f255e..532bf80 100644
318 --- a/WindowManager/src/windowmanager.hpp
319 +++ b/WindowManager/src/windowmanager.hpp
320 @@ -25,6 +25,7 @@
321  
322  #ifdef HAVE_IVI_LAYERMANAGEMENT_API
323  #include <ilm/ilm_control.h>
324 +#include <vector>
325  #endif
326  class WindowManager : public QObject
327  {
328 @@ -50,9 +51,14 @@ private:
329  
330  #ifdef HAVE_IVI_LAYERMANAGEMENT_API
331      t_ilm_layer* m_showLayers;
332 +
333      QMap<pid_t, t_ilm_surface> m_appSurfaces;
334      QMap<pid_t, t_ilm_layer> m_appLayers;
335 -    int getLayerRenderOrder(t_ilm_layer* id_array);
336 +
337 +    QList<QString> m_keepApps; /* Apps needs to keep rendering */
338 +    QList<pid_t> m_bgApps;
339 +
340 +    t_ilm_layer* getLayerRenderOrder(int& num_layers);
341  
342      void createNewLayer(const int layerId);
343  
344 @@ -61,11 +67,14 @@ private:
345      pid_t m_pending_to_show;
346  
347      void addSurface(const t_ilm_surface surfaceId);
348 -    t_ilm_layer addSurfaceToAppLayer(pid_t pid, const int surfaceId);
349 +
350 +  t_ilm_layer addSurfaceToAppLayer(pid_t pid, const int surfaceId);
351      void addSurfaceToLayer(const int surfaceId, const int layerId);
352  
353      void configureHomeScreenMainSurface(const t_ilm_surface surface, const t_ilm_int width, const t_ilm_int height);
354      void configureAppSurface(const pid_t pid, const t_ilm_surface surface, const t_ilm_int width, const t_ilm_int height);
355 +
356 +    void renderLayers(void);
357  #endif
358      void updateScreen();
359  
360 @@ -118,6 +127,7 @@ public Q_SLOTS: // METHODS
361      int setSurfaceToLayoutArea(int surfaceId, int layoutAreaId);
362      void showLayer(int layer);
363      void showAppLayer(int pid);
364 +    void showAppLayer(const QString &app_id, int pid);
365  
366  Q_SIGNALS: // SIGNALS
367      void surfaceVisibilityChanged(int surfaceId, bool visible);
368 diff --git a/interfaces/windowmanager.xml b/interfaces/windowmanager.xml
369 index e3c6df3..9d8cafc 100644
370 --- a/interfaces/windowmanager.xml
371 +++ b/interfaces/windowmanager.xml
372 @@ -157,7 +157,7 @@
373                 -->
374                 <method name="getAvailableSurfaces">
375                         <arg name="surfaceIds" type="a(i)" direction="out"/>
376 -                       <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QList&lt;int&gt;"/> 
377 +                       <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="QList&lt;int&gt;"/>
378                 </method>
379  
380                 <!--
381 @@ -191,6 +191,7 @@
382                   Show layer for application .
383                 -->
384                 <method name="showAppLayer">
385 +                       <arg name="name" type="s" direction="in"/>
386                         <arg name="pid" type="i" direction="in"/>
387                 </method>
388                 <!--
389 @@ -205,4 +206,3 @@
390                 </method>
391         </interface>
392  </node>
393 -
394 -- 
395 2.7.4
396