2 * Copyright (c) 2017, 2018, 2019 TOYOTA MOTOR CORPORATION
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 #include <QGuiApplication>
19 #include "homescreenhandler.h"
21 #include "hmi-debug.h"
23 #include <qpa/qplatformnativeinterface.h>
25 #define APPLAUNCH_DBUS_IFACE "org.automotivelinux.AppLaunch"
26 #define APPLAUNCH_DBUS_OBJECT "/org/automotivelinux/AppLaunch"
28 void* HomescreenHandler::myThis = 0;
30 HomescreenHandler::HomescreenHandler(Shell *_aglShell, ApplicationLauncher *launcher, QObject *parent) :
34 mp_launcher = launcher;
35 applaunch_iface = new org::automotivelinux::AppLaunch(APPLAUNCH_DBUS_IFACE, APPLAUNCH_DBUS_OBJECT,
36 QDBusConnection::sessionBus(), this);
39 HomescreenHandler::~HomescreenHandler()
43 void HomescreenHandler::init(void)
48 * The "started" signal is received any time a start request is made to applaunchd,
49 * and the application either starts successfully or is already running. This
50 * effectively acts as a "switch to app X" action.
52 connect(applaunch_iface, SIGNAL(started(QString)), this, SLOT(appStarted(QString)));
53 connect(applaunch_iface, SIGNAL(terminated(QString)), this, SLOT(appTerminated(QString)));
57 static struct wl_output *
58 getWlOutput(QPlatformNativeInterface *native, QScreen *screen)
60 void *output = native->nativeResourceForScreen("output", screen);
61 return static_cast<struct ::wl_output*>(output);
64 void HomescreenHandler::tapShortcut(QString application_id)
66 HMI_DEBUG("HomeScreen","tapShortcut %s", application_id.toStdString().c_str());
68 QDBusPendingReply<> reply = applaunch_iface->start(application_id);
69 reply.waitForFinished();
70 if (reply.isError()) {
71 HMI_ERROR("HomeScreen","Unable to start application '%s': %s",
72 application_id.toStdString().c_str(),
73 reply.error().message().toStdString().c_str());
76 mp_launcher->setCurrent(application_id);
78 appStarted(application_id);
82 void HomescreenHandler::appStarted(const QString& application_id)
84 struct agl_shell *agl_shell = aglShell->shell.get();
85 QPlatformNativeInterface *native = qApp->platformNativeInterface();
86 struct wl_output *output = getWlOutput(native, qApp->screens().first());
88 HMI_DEBUG("HomeScreen", "Activating application %s", application_id.toStdString().c_str());
89 agl_shell_activate_app(agl_shell, application_id.toStdString().c_str(), output);
92 void HomescreenHandler::appTerminated(const QString& application_id)
94 HMI_DEBUG("HomeScreen", "Application %s terminated, activating launcher", application_id.toStdString().c_str());
95 appStarted("launcher");