/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
* Copyright 2013 - 2020, nymea GmbH
* Contact: contact@nymea.io
*
* This file is part of nymea.
* This project including source code and documentation is protected by
* copyright law, and remains the property of nymea GmbH. All rights, including
* reproduction, publication, editing and translation, are reserved. The use of
* this project is subject to the terms of a license agreement to be concluded
* with nymea GmbH in accordance with the terms of use of nymea GmbH, available
* under https://nymea.io/license
*
* GNU General Public License Usage
* Alternatively, this project may be redistributed and/or modified under the
* terms of the GNU General Public License as published by the Free Software
* Foundation, GNU version 3. This project is distributed in the hope that it
* will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
* Public License for more details.
*
* You should have received a copy of the GNU General Public License along with
* this project. If not, see .
*
* For any further details and any questions please contact us under
* contact@nymea.io or see our FAQ/Licensing Information on
* https://nymea.io/license/faq
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#include "platformhelperandroid.h"
#include
#include
#include
#include
// WindowManager.LayoutParams
#define FLAG_TRANSLUCENT_STATUS 0x04000000
#define FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS 0x80000000
// View
#define SYSTEM_UI_FLAG_LIGHT_STATUS_BAR 0x00002000
static PlatformHelperAndroid *m_instance;
static QAndroidJniObject getAndroidWindow()
{
QAndroidJniObject window = QtAndroid::androidActivity().callObjectMethod("getWindow", "()Landroid/view/Window;");
return window;
}
PlatformHelperAndroid::PlatformHelperAndroid(QObject *parent) : PlatformHelper(parent)
{
// QAndroidIntent serviceIntent(QtAndroid::androidActivity().object(), "io.guh.nymeaapp.NymeaAppControlService");
// m_serviceConnection = new DeviceControlServiceConnection();
// QtAndroid::bindService(serviceIntent, *m_serviceConnection, QtAndroid::BindFlag::AutoCreate);
m_instance = this;
}
void PlatformHelperAndroid::requestPermissions()
{
// Not using any fancy permissions in android yet...
}
void PlatformHelperAndroid::hideSplashScreen()
{
// Android's splash will flicker when fading out twice
static bool alreadyHiding = false;
if (!alreadyHiding) {
QtAndroid::hideSplashScreen(250);
alreadyHiding = true;
}
}
bool PlatformHelperAndroid::hasPermissions() const
{
// Not using any fancy permissions in android yet...
return true;
}
QString PlatformHelperAndroid::machineHostname() const
{
// QSysInfo::machineHostname always gives "localhost" on android... best we can do here is:
return deviceManufacturer() + " " + deviceModel();
}
QString PlatformHelperAndroid::deviceSerial() const
{
QAndroidJniObject activity = QAndroidJniObject::callStaticObjectMethod("org/qtproject/qt5/android/QtNative", "activity", "()Landroid/app/Activity;");
return activity.callObjectMethod("deviceSerial").toString();
}
QString PlatformHelperAndroid::device() const
{
return QAndroidJniObject::callStaticObjectMethod("io/guh/nymeaapp/NymeaAppActivity","device").toString();
}
QString PlatformHelperAndroid::deviceModel() const
{
return QAndroidJniObject::callStaticObjectMethod("io/guh/nymeaapp/NymeaAppActivity","deviceModel").toString();
}
QString PlatformHelperAndroid::deviceManufacturer() const
{
return QAndroidJniObject::callStaticObjectMethod("io/guh/nymeaapp/NymeaAppActivity","deviceManufacturer").toString();
}
void PlatformHelperAndroid::vibrate(PlatformHelper::HapticsFeedback feedbackType)
{
int duration;
switch (feedbackType) {
case HapticsFeedbackSelection:
duration = 10;
break;
case HapticsFeedbackImpact:
duration = 30;
break;
case HapticsFeedbackNotification:
duration = 500;
break;
}
QtAndroid::androidActivity().callMethod("vibrate","(I)V", duration);
}
void PlatformHelperAndroid::syncThings()
{
QAndroidIntent serviceIntent(QtAndroid::androidActivity().object(),
"io/guh/nymeaapp/NymeaAppService");
QAndroidJniObject result = QtAndroid::androidActivity().callObjectMethod(
"startService",
"(Landroid/content/Intent;)Landroid/content/ComponentName;",
serviceIntent.handle().object());
// QtAndroid::androidService()
// QAndroidIntent serviceIntent(QtAndroid::androidActivity().object(),
// "io/guh/nymeaapp/NymeaAppControlService");
// serviceIntent.putExtra("name", QByteArray("foobar"));
// m_serviceConnection->handle().callMethod("syncThings", "(Ljava/lang/String;)V", "bla");
// QAndroidJniObject result = QtAndroid::androidActivity().callObjectMethod(
// "syncThings",
// "(Landroid/content/Intent;)Landroid/content/ComponentName;",
// m_serviceConnection->handle().object());
}
void PlatformHelperAndroid::setTopPanelColor(const QColor &color)
{
PlatformHelper::setTopPanelColor(color);
if (QtAndroid::androidSdkVersion() < 21)
return;
QtAndroid::runOnAndroidThread([=]() {
QAndroidJniObject window = getAndroidWindow();
window.callMethod("addFlags", "(I)V", FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.callMethod("clearFlags", "(I)V", FLAG_TRANSLUCENT_STATUS);
window.callMethod("setStatusBarColor", "(I)V", color.rgba());
});
if (((color.red() * 299 + color.green() * 587 + color.blue() * 114) / 1000) > 123) {
setTopPanelTheme(Light);
} else {
setTopPanelTheme(Dark);
}
}
void PlatformHelperAndroid::setBottomPanelColor(const QColor &color)
{
PlatformHelper::setBottomPanelColor(color);
if (QtAndroid::androidSdkVersion() < 21)
return;
}
void PlatformHelperAndroid::permissionRequestFinished(const QtAndroid::PermissionResultMap &result)
{
foreach (const QString &key, result.keys()) {
qDebug() << "Permission result:" << key << static_cast(result.value(key));
}
emit m_instance->permissionsRequestFinished();
}
void PlatformHelperAndroid::setTopPanelTheme(PlatformHelperAndroid::Theme theme)
{
if (QtAndroid::androidSdkVersion() < 23)
return;
QtAndroid::runOnAndroidThread([=]() {
QAndroidJniObject window = getAndroidWindow();
QAndroidJniObject view = window.callObjectMethod("getDecorView", "()Landroid/view/View;");
int visibility = view.callMethod("getSystemUiVisibility", "()I");
if (theme == Theme::Light)
visibility |= SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
else
visibility &= ~SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
view.callMethod("setSystemUiVisibility", "(I)V", visibility);
});
}