diff --git a/nymea-app/main.cpp b/nymea-app/main.cpp index 590ef362..9d5d81d7 100644 --- a/nymea-app/main.cpp +++ b/nymea-app/main.cpp @@ -101,6 +101,11 @@ int main(int argc, char *argv[]) qCInfo(dcApplication()) << "System:" << QSysInfo::machineHostName() << QSysInfo::prettyProductName() << QSysInfo::productType() << QSysInfo::productVersion() << PlatformHelper::instance()->deviceManufacturer() << PlatformHelper::instance()->deviceModel(); qCInfo(dcApplication()) << "Locale:" << QLocale() << QLocale().name() << QLocale().language(); + QScreen *screen = application.primaryScreen(); + qCInfo(dcApplication()).noquote() << QString("Screen name: %1").arg(screen->name()); + qCInfo(dcApplication()).noquote() << QString("Device Pixel Ratio: %1").arg(screen->devicePixelRatio()); + qCInfo(dcApplication()).noquote() << QString("Screen Resolution: %1 x %2").arg(screen->geometry().width()).arg(screen->geometry().height()); + foreach (const QString &argument, application.arguments()) { if (argument.startsWith("nymea://notification")) { PlatformHelper::instance()->notificationActionReceived(QUrlQuery(QUrl(argument).query()).queryItemValue("nymeaData")); diff --git a/nymea-app/nymea-app.pro b/nymea-app/nymea-app.pro index fb440ef1..b4c70af2 100644 --- a/nymea-app/nymea-app.pro +++ b/nymea-app/nymea-app.pro @@ -90,7 +90,7 @@ android { include(../3rdParty/android/android_openssl/openssl.pri) ANDROID_MIN_SDK_VERSION = 21 - ANDROID_TARGET_SDK_VERSION = 33 + ANDROID_TARGET_SDK_VERSION = 35 QT += androidextras HEADERS += platformintegration/android/platformhelperandroid.h \ @@ -119,6 +119,7 @@ android { $$ANDROID_PACKAGE_SOURCE_DIR/build.gradle \ $$ANDROID_PACKAGE_SOURCE_DIR/gradle/wrapper/gradle-wrapper.properties \ $$ANDROID_PACKAGE_SOURCE_DIR/gradlew.bat \ + $$ANDROID_PACKAGE_SOURCE_DIR/gradle.properties \ $$ANDROID_PACKAGE_SOURCE_DIR/LICENSE \ platformintegration/android/java/io/guh/nymeaapp/NymeaAppActivity.java \ platformintegration/android/java-firebase/io/guh/nymeaapp/NymeaAppNotificationService.java \ diff --git a/nymea-app/platformhelper.cpp b/nymea-app/platformhelper.cpp index 4a384078..1c64cec0 100644 --- a/nymea-app/platformhelper.cpp +++ b/nymea-app/platformhelper.cpp @@ -1,6 +1,6 @@ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -* Copyright 2013 - 2020, nymea GmbH +* Copyright 2013 - 2025, nymea GmbH * Contact: contact@nymea.io * * This file is part of nymea. @@ -192,6 +192,26 @@ void PlatformHelper::setBottomPanelColor(const QColor &color) } } +int PlatformHelper::topPadding() const +{ + return 0; +} + +int PlatformHelper::bottomPadding() const +{ + return 0; +} + +int PlatformHelper::leftPadding() const +{ + return 0; +} + +int PlatformHelper::rightPadding() const +{ + return 0; +} + bool PlatformHelper::darkModeEnabled() const { return false; diff --git a/nymea-app/platformhelper.h b/nymea-app/platformhelper.h index 31810d54..e5d052d7 100644 --- a/nymea-app/platformhelper.h +++ b/nymea-app/platformhelper.h @@ -1,6 +1,6 @@ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -* Copyright 2013 - 2020, nymea GmbH +* Copyright 2013 - 2025, nymea GmbH * Contact: contact@nymea.io * * This file is part of nymea. @@ -58,6 +58,10 @@ class PlatformHelper : public QObject Q_PROPERTY(bool darkModeEnabled READ darkModeEnabled NOTIFY darkModeEnabledChanged) Q_PROPERTY(QVariantList pendingNotificationActions READ pendingNotificationActions NOTIFY pendingNotificationActionsChanged) Q_PROPERTY(bool locationServicesEnabled READ locationServicesEnabled NOTIFY locationServicesEnabledChanged) + Q_PROPERTY(int topPadding READ topPadding CONSTANT) + Q_PROPERTY(int bottomPadding READ bottomPadding CONSTANT) + Q_PROPERTY(int leftPadding READ leftPadding CONSTANT) + Q_PROPERTY(int rightPadding READ rightPadding CONSTANT) public: enum HapticsFeedback { @@ -88,6 +92,11 @@ public: virtual QColor bottomPanelColor() const; virtual void setBottomPanelColor(const QColor &color); + virtual int topPadding() const; + virtual int bottomPadding() const; + virtual int leftPadding() const; + virtual int rightPadding() const; + virtual bool darkModeEnabled() const; QVariantList pendingNotificationActions() const; diff --git a/nymea-app/platformintegration/android/java-firebase/io/guh/nymeaapp/NymeaAppNotificationService.java b/nymea-app/platformintegration/android/java-firebase/io/guh/nymeaapp/NymeaAppNotificationService.java index e8f49173..10daf500 100644 --- a/nymea-app/platformintegration/android/java-firebase/io/guh/nymeaapp/NymeaAppNotificationService.java +++ b/nymea-app/platformintegration/android/java-firebase/io/guh/nymeaapp/NymeaAppNotificationService.java @@ -27,7 +27,6 @@ public class NymeaAppNotificationService extends FirebaseMessagingService { private static final String TAG = "nymea-app: NymeaAppNotificationService"; - private int hashId(String id) { int hash = 7; for (int i = 0; i < id.length(); i++) { diff --git a/nymea-app/platformintegration/android/java/io/guh/nymeaapp/NymeaAppActivity.java b/nymea-app/platformintegration/android/java/io/guh/nymeaapp/NymeaAppActivity.java index 1f18dbb9..87b31da6 100644 --- a/nymea-app/platformintegration/android/java/io/guh/nymeaapp/NymeaAppActivity.java +++ b/nymea-app/platformintegration/android/java/io/guh/nymeaapp/NymeaAppActivity.java @@ -17,6 +17,9 @@ import android.content.IntentFilter; import android.content.BroadcastReceiver; import android.location.LocationManager; import androidx.core.content.FileProvider; +import androidx.core.view.ViewCompat; +import androidx.core.view.WindowCompat; +import android.view.WindowInsets; public class NymeaAppActivity extends org.qtproject.qt5.android.bindings.QtActivity { @@ -40,6 +43,8 @@ public class NymeaAppActivity extends org.qtproject.qt5.android.bindings.QtActiv @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + // Move th app to the background (Edge to edge is forced since SDK 35) + //WindowCompat.setDecorFitsSystemWindows(getWindow(), true); this.context = getApplicationContext(); } @@ -57,7 +62,7 @@ public class NymeaAppActivity extends org.qtproject.qt5.android.bindings.QtActiv super.onResume(); IntentFilter filter = new IntentFilter(LocationManager.MODE_CHANGED_ACTION); -// filter.addAction(Intent.ACTION_PROVIDER_CHANGED); + // filter.addAction(Intent.ACTION_PROVIDER_CHANGED); registerReceiver(m_gpsSwitchStateReceiver, filter); } @@ -135,4 +140,15 @@ public class NymeaAppActivity extends org.qtproject.qt5.android.bindings.QtActiv int mode = Settings.Secure.getInt(getApplicationContext().getContentResolver(), Settings.Secure.LOCATION_MODE, Settings.Secure.LOCATION_MODE_OFF); return (mode != Settings.Secure.LOCATION_MODE_OFF); } + + public int topPadding() { + WindowInsets windowInsets = getWindow().getDecorView().getRootWindowInsets(); + return windowInsets.getInsets(WindowInsets.Type.statusBars() | WindowInsets.Type.displayCutout()).top; + } + + public int bottomPadding() { + WindowInsets windowInsets = getWindow().getDecorView().getRootWindowInsets(); + return windowInsets.getInsets(WindowInsets.Type.navigationBars() | WindowInsets.Type.displayCutout()).bottom; + } + } diff --git a/nymea-app/platformintegration/android/platformhelperandroid.cpp b/nymea-app/platformintegration/android/platformhelperandroid.cpp index 71f4341a..23bb5226 100644 --- a/nymea-app/platformintegration/android/platformhelperandroid.cpp +++ b/nymea-app/platformintegration/android/platformhelperandroid.cpp @@ -1,6 +1,6 @@ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -* Copyright 2013 - 2020, nymea GmbH +* Copyright 2013 - 2025, nymea GmbH * Contact: contact@nymea.io * * This file is part of nymea. @@ -30,12 +30,12 @@ #include "platformhelperandroid.h" -#include -#include #include +#include +#include #include #include - +#include // WindowManager.LayoutParams #define FLAG_TRANSLUCENT_STATUS 0x04000000 @@ -51,7 +51,7 @@ static JNINativeMethod methods[] = { { "darkModeEnabledChangedJNI", "()V", (void *)PlatformHelperAndroid::darkModeEnabledChangedJNI }, { "notificationActionReceivedJNI", "(Ljava/lang/String;)V", (void *)PlatformHelperAndroid::notificationActionReceivedJNI }, { "locationServicesEnabledChangedJNI", "()V", (void *)PlatformHelperAndroid::locationServicesEnabledChangedJNI }, -}; + }; JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* /*reserved*/) { @@ -86,7 +86,7 @@ PlatformHelperAndroid::PlatformHelperAndroid(QObject *parent) : PlatformHelper(p } connect(qApp, &QApplication::applicationStateChanged, this, [this](Qt::ApplicationState state){ - qCritical() << "******* app state change"; + qCritical() << "----> Application state changed" << state; if (state == Qt::ApplicationActive) { emit locationServicesEnabledChanged(); } @@ -180,7 +180,7 @@ void PlatformHelperAndroid::setTopPanelColor(const QColor &color) PlatformHelper::setTopPanelColor(color); if (QtAndroid::androidSdkVersion() < 21) - return; + return; QtAndroid::runOnAndroidThread([=]() { QAndroidJniObject window = getAndroidWindow(); @@ -248,7 +248,26 @@ void PlatformHelperAndroid::setBottomPanelTheme(Theme theme) visibility &= ~SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR; view.callMethod("setSystemUiVisibility", "(I)V", visibility); }); +} +int PlatformHelperAndroid::topPadding() const +{ + // Edge to edge has been forced since android SDK 35 + // We don't want to handle it in earlied versions. + if (QtAndroid::androidSdkVersion() < 35) + return 0; + + return QtAndroid::androidActivity().callMethod("topPadding") / QApplication::primaryScreen()->devicePixelRatio(); +} + +int PlatformHelperAndroid::bottomPadding() const +{ + // Edge to edge has been forced since android SDK 35 + // We don't want to handle it in earlied versions. + if (QtAndroid::androidSdkVersion() < 35) + return 0; + + return QtAndroid::androidActivity().callMethod("bottomPadding") / QApplication::primaryScreen()->devicePixelRatio(); } bool PlatformHelperAndroid::darkModeEnabled() const diff --git a/nymea-app/platformintegration/android/platformhelperandroid.h b/nymea-app/platformintegration/android/platformhelperandroid.h index c88fe6c6..48fec155 100644 --- a/nymea-app/platformintegration/android/platformhelperandroid.h +++ b/nymea-app/platformintegration/android/platformhelperandroid.h @@ -1,6 +1,6 @@ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * -* Copyright 2013 - 2020, nymea GmbH +* Copyright 2013 - 2025, nymea GmbH * Contact: contact@nymea.io * * This file is part of nymea. @@ -60,6 +60,9 @@ public: void setBottomPanelColor(const QColor &color) override; void setBottomPanelTheme(Theme theme); + int topPadding() const override; + int bottomPadding() const override; + bool darkModeEnabled() const override; bool locationServicesEnabled() const override; diff --git a/nymea-app/platformintegration/android/platformpermissionsandroid.cpp b/nymea-app/platformintegration/android/platformpermissionsandroid.cpp index 5587ed11..be4b7cb1 100644 --- a/nymea-app/platformintegration/android/platformpermissionsandroid.cpp +++ b/nymea-app/platformintegration/android/platformpermissionsandroid.cpp @@ -1,12 +1,11 @@ #include "platformpermissionsandroid.h" -#include #include +#include #include #include #include "logging.h" - NYMEA_LOGGING_CATEGORY(dcPlatformPermissions, "PlatformPermissions") PlatformPermissionsAndroid * PlatformPermissionsAndroid::s_instance = nullptr; diff --git a/nymea-app/ui/MainPage.qml b/nymea-app/ui/MainPage.qml index 262644d0..cdabb51f 100644 --- a/nymea-app/ui/MainPage.qml +++ b/nymea-app/ui/MainPage.qml @@ -78,7 +78,6 @@ Page { header: Item { id: mainHeader height: 0 - HeaderButton { id: menuButton imageSource: "qrc:/icons/navigation-menu.svg" diff --git a/nymea-app/ui/RootItem.qml b/nymea-app/ui/RootItem.qml index f6cb0926..bfd474e5 100644 --- a/nymea-app/ui/RootItem.qml +++ b/nymea-app/ui/RootItem.qml @@ -33,6 +33,7 @@ import QtQuick.Controls 2.2 import QtQuick.Controls.Material 2.2 import QtQuick.Layouts 1.3 import Qt.labs.settings 1.0 +import QtQuick.Window 2.15 import Nymea 1.0 import NymeaApp.Utils 1.0 import "components" @@ -82,6 +83,12 @@ Item { ColumnLayout { anchors.fill: parent + + anchors.topMargin: PlatformHelper.topPadding + anchors.bottomMargin: PlatformHelper.bottomPadding + anchors.leftMargin: PlatformHelper.leftPadding + anchors.rightMargin: PlatformHelper.rightPadding + spacing: 0 SwipeView { diff --git a/packaging/android/AndroidManifest.xml b/packaging/android/AndroidManifest.xml index 57f3f05c..9fb672d2 100644 --- a/packaging/android/AndroidManifest.xml +++ b/packaging/android/AndroidManifest.xml @@ -8,7 +8,14 @@ - + diff --git a/packaging/android/build.gradle b/packaging/android/build.gradle index 61f23898..f2e95a3e 100644 --- a/packaging/android/build.gradle +++ b/packaging/android/build.gradle @@ -15,7 +15,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:8.2.2' + classpath 'com.android.tools.build:gradle:8.11.0' classpath 'com.google.gms:google-services:4.3.8' } } @@ -39,7 +39,9 @@ dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'org.reactivestreams:reactive-streams:1.0.3' implementation 'io.reactivex.rxjava2:rxjava:2.2.0' - implementation 'androidx.core:core:1.3.2' + implementation 'androidx.core:core:1.16.0' + implementation 'androidx.activity:activity:1.10.1' + implementation 'androidx.fragment:fragment:1.8.8' if ("${useFirebase}" == "true") { implementation 'com.google.android.gms:play-services-base:18.1.0' @@ -116,5 +118,6 @@ android { resConfigs "en", "de", "ko", "it", "nl", "es" minSdkVersion = 23 targetSdkVersion = 35 + ndk.abiFilters = qtTargetAbiList.split(",") } } diff --git a/packaging/android/gradle/wrapper/gradle-wrapper.properties b/packaging/android/gradle/wrapper/gradle-wrapper.properties index 15de9024..2733ed5d 100644 --- a/packaging/android/gradle/wrapper/gradle-wrapper.properties +++ b/packaging/android/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/version.txt b/version.txt index be2d6dee..9eba98b4 100644 --- a/version.txt +++ b/version.txt @@ -1,2 +1,2 @@ -1.10.6 -671 +1.10.7 +672