diff --git a/nymea-app/main.cpp b/nymea-app/main.cpp index 377210aa..03cbe386 100644 --- a/nymea-app/main.cpp +++ b/nymea-app/main.cpp @@ -81,7 +81,6 @@ int main(int argc, char *argv[]) QCommandLineOption styleOption = QCommandLineOption({"s", "style"}, "Override the style. Style in settings will be disabled.", "style"); parser.addOption(styleOption); QCommandLineOption defaultStyleOption = QCommandLineOption({"d", "default-style"}, "The default style to be used if there is no style explicitly selected by the user yet.", "style"); - defaultStyleOption.setDefaultValue("light"); parser.addOption(defaultStyleOption); #endif QCommandLineOption defaultViewsOption = QCommandLineOption({"v", "default-views"}, "The main views enabled by default if there is no configuration done by the user and the style doesn't dictate them, comma separated.", "mainviews"); @@ -119,9 +118,17 @@ int main(int argc, char *argv[]) StyleController styleController(BRANDING); styleController.lockToStyle(BRANDING); #else - StyleController styleController(parser.value(defaultStyleOption)); + QString defaultStyle; + if (parser.isSet(defaultStyleOption)) { + defaultStyle = parser.value(defaultStyleOption); + } else if (PlatformHelper::instance()->darkModeEnabled()) { + defaultStyle = "dark"; + } else { + defaultStyle = "light"; + } + StyleController styleController(defaultStyle); if (parser.isSet(styleOption)) { - qCInfo(dcApplication()) << "Setting style to" << parser.value(styleOption); + qCInfo(dcApplication()) << "Setting style to" << defaultStyle; styleController.lockToStyle(parser.value(styleOption)); } #endif diff --git a/nymea-app/nymea-app.pro b/nymea-app/nymea-app.pro index 50757505..d56a2848 100644 --- a/nymea-app/nymea-app.pro +++ b/nymea-app/nymea-app.pro @@ -155,7 +155,8 @@ ios: { ../packaging/ios/GoogleService-Info.plist ios_icon_files.files += $$files(../packaging/ios/AppIcons.xcassets/AppIcon.appiconset/AppIcon*.png) - ios_launch_images.files += $$files(../packaging/ios/LaunchImage*.png) ../packaging/ios/LaunchScreen1.xib + ios_launch_images.files += $$files(../packaging/ios/AppIcons.xcassets/LaunchScreen.imageset/*.png) \ + ../packaging/ios/NymeaLaunchScreen.storyboard QMAKE_BUNDLE_DATA += ios_icon_files ios_launch_images IOS_DEVELOPMENT_TEAM.name = DEVELOPMENT_TEAM diff --git a/nymea-app/platformhelper.cpp b/nymea-app/platformhelper.cpp index fcf84a4b..4e01fb86 100644 --- a/nymea-app/platformhelper.cpp +++ b/nymea-app/platformhelper.cpp @@ -173,6 +173,11 @@ void PlatformHelper::setBottomPanelColor(const QColor &color) } } +bool PlatformHelper::darkModeEnabled() const +{ + return false; +} + bool PlatformHelper::splashVisible() const { return m_splashVisible; diff --git a/nymea-app/platformhelper.h b/nymea-app/platformhelper.h index f3ad8edb..8e8a30ec 100644 --- a/nymea-app/platformhelper.h +++ b/nymea-app/platformhelper.h @@ -53,6 +53,7 @@ class PlatformHelper : public QObject Q_PROPERTY(int screenBrightness READ screenBrightness WRITE setScreenBrightness NOTIFY screenBrightnessChanged) Q_PROPERTY(QColor topPanelColor READ topPanelColor WRITE setTopPanelColor NOTIFY topPanelColorChanged) Q_PROPERTY(QColor bottomPanelColor READ bottomPanelColor WRITE setBottomPanelColor NOTIFY bottomPanelColorChanged) + Q_PROPERTY(bool darkModeEnabled READ darkModeEnabled NOTIFY darkModeEnabledChanged) public: enum HapticsFeedback { @@ -86,6 +87,8 @@ public: virtual QColor bottomPanelColor() const; virtual void setBottomPanelColor(const QColor &color); + virtual bool darkModeEnabled() const; + virtual bool splashVisible() const; virtual void setSplashVisible(bool splashVisible); Q_INVOKABLE virtual void hideSplashScreen(); @@ -105,6 +108,7 @@ signals: void screenBrightnessChanged(); void topPanelColorChanged(); void bottomPanelColorChanged(); + void darkModeEnabledChanged(); void splashVisibleChanged(); protected: 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 92e24bf2..93b5e29f 100644 --- a/nymea-app/platformintegration/android/java/io/guh/nymeaapp/NymeaAppActivity.java +++ b/nymea-app/platformintegration/android/java/io/guh/nymeaapp/NymeaAppActivity.java @@ -12,18 +12,28 @@ import android.provider.Settings.Secure; import android.os.Vibrator; import android.net.Uri; import android.support.v4.content.FileProvider; +import android.content.res.Configuration; public class NymeaAppActivity extends org.qtproject.qt5.android.bindings.QtActivity { private static final String TAG = "nymea-app: NymeaAppActivity"; private static Context context = null; + private static native void nightModeEnabledChangedJNI(); + @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.context = getApplicationContext(); } + @Override + public void onConfigurationChanged(Configuration newConfig) { + super.onConfigurationChanged(newConfig); + NymeaAppActivity.nightModeEnabledChangedJNI(); + } + + public static Context getAppContext() { return NymeaAppActivity.context; } @@ -66,4 +76,8 @@ public class NymeaAppActivity extends org.qtproject.qt5.android.bindings.QtActiv Log.d(TAG, "Intent not resolved"); } } + + public boolean nightModeEnabled() { + return (getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK) == Configuration.UI_MODE_NIGHT_YES; + } } diff --git a/nymea-app/platformintegration/android/platformhelperandroid.cpp b/nymea-app/platformintegration/android/platformhelperandroid.cpp index e058da4c..318fa18e 100644 --- a/nymea-app/platformintegration/android/platformhelperandroid.cpp +++ b/nymea-app/platformintegration/android/platformhelperandroid.cpp @@ -42,8 +42,28 @@ // View #define SYSTEM_UI_FLAG_LIGHT_STATUS_BAR 0x00002000 +static PlatformHelperAndroid *m_instance = nullptr; -static PlatformHelperAndroid *m_instance; +static JNINativeMethod methods[] = { + { "darkModeEnabledChangedJNI", "()V", (void *)PlatformHelperAndroid::darkModeEnabledChangedJNI }, +}; + +JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* /*reserved*/) +{ + JNIEnv* env; + if (vm->GetEnv(reinterpret_cast(&env), JNI_VERSION_1_6) != JNI_OK) { + return JNI_ERR; + } + + jclass javaClass = env->FindClass("io/guh/nymeaapp/NymeaAppActivity"); + if (!javaClass) + return JNI_ERR; + + if (env->RegisterNatives(javaClass, methods, sizeof(methods) / sizeof(methods[0])) < 0) { + return JNI_ERR; + } + return JNI_VERSION_1_6; +} static QAndroidJniObject getAndroidWindow() { @@ -54,6 +74,7 @@ static QAndroidJniObject getAndroidWindow() PlatformHelperAndroid::PlatformHelperAndroid(QObject *parent) : PlatformHelper(parent) { m_instance = this; + } void PlatformHelperAndroid::requestPermissions() @@ -178,6 +199,11 @@ void PlatformHelperAndroid::setBottomPanelColor(const QColor &color) return; } +bool PlatformHelperAndroid::darkModeEnabled() const +{ + return QtAndroid::androidActivity().callMethod("darkModeEnabled"); +} + void PlatformHelperAndroid::shareFile(const QString &fileName) { QtAndroid::androidActivity().callMethod("shareFile", "(Ljava/lang/String;)V", @@ -193,6 +219,13 @@ void PlatformHelperAndroid::permissionRequestFinished(const QtAndroid::Permissio emit m_instance->permissionsRequestFinished(); } +void PlatformHelperAndroid::darkModeEnabledChangedJNI() +{ + if (m_instance) { + emit m_instance->darkModeEnabledChanged(); + } +} + void PlatformHelperAndroid::setTopPanelTheme(PlatformHelperAndroid::Theme theme) { if (QtAndroid::androidSdkVersion() < 23) diff --git a/nymea-app/platformintegration/android/platformhelperandroid.h b/nymea-app/platformintegration/android/platformhelperandroid.h index 62980518..bfbe5c7e 100644 --- a/nymea-app/platformintegration/android/platformhelperandroid.h +++ b/nymea-app/platformintegration/android/platformhelperandroid.h @@ -62,8 +62,12 @@ public: void setTopPanelTheme(Theme theme); void setBottomPanelColor(const QColor &color) override; + bool darkModeEnabled() const override; + void shareFile(const QString &fileName) override; + static void darkModeEnabledChangedJNI(); + private: static void permissionRequestFinished(const QtAndroid::PermissionResultMap &); }; diff --git a/nymea-app/platformintegration/ios/platformhelperios.h b/nymea-app/platformintegration/ios/platformhelperios.h index ec431e47..f28e2e81 100644 --- a/nymea-app/platformintegration/ios/platformhelperios.h +++ b/nymea-app/platformintegration/ios/platformhelperios.h @@ -57,6 +57,8 @@ public: void setTopPanelColor(const QColor &color) override; void setBottomPanelColor(const QColor &color) override; + bool darkModeEnabled() const override; + void shareFile(const QString &fileName) override; private: diff --git a/packaging/android/res/drawable-night/splash.xml b/packaging/android/res/drawable-night/splash.xml new file mode 100644 index 00000000..68407a1f --- /dev/null +++ b/packaging/android/res/drawable-night/splash.xml @@ -0,0 +1,10 @@ + + + + + + + + + diff --git a/packaging/android/res/mipmap-anydpi/nymea_splash_horizontal.xml b/packaging/android/res/mipmap-anydpi/nymea_splash_horizontal.xml index 2f251e9a..cdc6824d 100644 --- a/packaging/android/res/mipmap-anydpi/nymea_splash_horizontal.xml +++ b/packaging/android/res/mipmap-anydpi/nymea_splash_horizontal.xml @@ -5,7 +5,7 @@ android:height="595.28dp"> + android:fillColor="#ffffff" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packaging/android/res/values-night/colors.xml b/packaging/android/res/values-night/colors.xml new file mode 100644 index 00000000..e5a8857a --- /dev/null +++ b/packaging/android/res/values-night/colors.xml @@ -0,0 +1,4 @@ + + + #ffffff + diff --git a/packaging/android/res/values-night/splashscreentheme.xml b/packaging/android/res/values-night/splashscreentheme.xml new file mode 100644 index 00000000..915db62c --- /dev/null +++ b/packaging/android/res/values-night/splashscreentheme.xml @@ -0,0 +1,6 @@ + + + + diff --git a/packaging/ios/AppIcons.xcassets/Contents.json b/packaging/ios/AppIcons.xcassets/Contents.json new file mode 100644 index 00000000..73c00596 --- /dev/null +++ b/packaging/ios/AppIcons.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/packaging/ios/AppIcons.xcassets/Launchscreen.imageset/Contents.json b/packaging/ios/AppIcons.xcassets/Launchscreen.imageset/Contents.json new file mode 100644 index 00000000..08f711bf --- /dev/null +++ b/packaging/ios/AppIcons.xcassets/Launchscreen.imageset/Contents.json @@ -0,0 +1,56 @@ +{ + "images" : [ + { + "filename" : "LuanchScreen-light-1x.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "LuanchScreen-dark-1x.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "LuanchScreen-light-2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "LuanchScreen-dark-2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "LuanchScreen-light-3x.png", + "idiom" : "universal", + "scale" : "3x" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "filename" : "LuanchScreen-dark-3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/packaging/ios/AppIcons.xcassets/Launchscreen.imageset/LuanchScreen-dark-1x.png b/packaging/ios/AppIcons.xcassets/Launchscreen.imageset/LuanchScreen-dark-1x.png new file mode 100644 index 00000000..bf2fb4a4 Binary files /dev/null and b/packaging/ios/AppIcons.xcassets/Launchscreen.imageset/LuanchScreen-dark-1x.png differ diff --git a/packaging/ios/AppIcons.xcassets/Launchscreen.imageset/LuanchScreen-dark-2x.png b/packaging/ios/AppIcons.xcassets/Launchscreen.imageset/LuanchScreen-dark-2x.png new file mode 100644 index 00000000..a8faafed Binary files /dev/null and b/packaging/ios/AppIcons.xcassets/Launchscreen.imageset/LuanchScreen-dark-2x.png differ diff --git a/packaging/ios/AppIcons.xcassets/Launchscreen.imageset/LuanchScreen-dark-3x.png b/packaging/ios/AppIcons.xcassets/Launchscreen.imageset/LuanchScreen-dark-3x.png new file mode 100644 index 00000000..618e7bb1 Binary files /dev/null and b/packaging/ios/AppIcons.xcassets/Launchscreen.imageset/LuanchScreen-dark-3x.png differ diff --git a/packaging/ios/AppIcons.xcassets/Launchscreen.imageset/LuanchScreen-light-1x.png b/packaging/ios/AppIcons.xcassets/Launchscreen.imageset/LuanchScreen-light-1x.png new file mode 100644 index 00000000..8dd549d0 Binary files /dev/null and b/packaging/ios/AppIcons.xcassets/Launchscreen.imageset/LuanchScreen-light-1x.png differ diff --git a/packaging/ios/AppIcons.xcassets/Launchscreen.imageset/LuanchScreen-light-2x.png b/packaging/ios/AppIcons.xcassets/Launchscreen.imageset/LuanchScreen-light-2x.png new file mode 100644 index 00000000..ff025346 Binary files /dev/null and b/packaging/ios/AppIcons.xcassets/Launchscreen.imageset/LuanchScreen-light-2x.png differ diff --git a/packaging/ios/AppIcons.xcassets/Launchscreen.imageset/LuanchScreen-light-3x.png b/packaging/ios/AppIcons.xcassets/Launchscreen.imageset/LuanchScreen-light-3x.png new file mode 100644 index 00000000..09436633 Binary files /dev/null and b/packaging/ios/AppIcons.xcassets/Launchscreen.imageset/LuanchScreen-light-3x.png differ diff --git a/packaging/ios/Info.plist.in b/packaging/ios/Info.plist.in index 43508eeb..0001caa9 100644 --- a/packaging/ios/Info.plist.in +++ b/packaging/ios/Info.plist.in @@ -25,7 +25,7 @@ NOTE This file was generated by Qt/QMake. UILaunchStoryboardName - LaunchScreen1 + NymeaLaunchScreen UISupportedInterfaceOrientations UIInterfaceOrientationPortrait diff --git a/packaging/ios/LaunchImage-iOS7@2x.png b/packaging/ios/LaunchImage-iOS7@2x.png deleted file mode 100644 index 0f37e19d..00000000 Binary files a/packaging/ios/LaunchImage-iOS7@2x.png and /dev/null differ diff --git a/packaging/ios/LaunchScreen1.xib b/packaging/ios/LaunchScreen1.xib deleted file mode 100644 index fde31be0..00000000 --- a/packaging/ios/LaunchScreen1.xib +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packaging/ios/NymeaLaunchScreen.storyboard b/packaging/ios/NymeaLaunchScreen.storyboard new file mode 100644 index 00000000..d5f3e1ed --- /dev/null +++ b/packaging/ios/NymeaLaunchScreen.storyboard @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packaging/ios/platformhelperios.mm b/packaging/ios/platformhelperios.mm index 22d6fb6a..d64de231 100644 --- a/packaging/ios/platformhelperios.mm +++ b/packaging/ios/platformhelperios.mm @@ -128,6 +128,14 @@ void PlatformHelperIOS::setBottomPanelColorInternal(const QColor &color) app.windows.firstObject.backgroundColor = [UIColor colorWithRed:color.redF() green:color.greenF() blue:color.blueF() alpha:color.alphaF()]; } +bool PlatformHelperIOS::darkModeEnabled() const +{ + if (@available(iOS 12.0, *)) { + return UIScreen.mainScreen.traitCollection.userInterfaceStyle == UIUserInterfaceStyleDark; + } + return false; +} + void PlatformHelperIOS::shareFile(const QString &fileName) { UIActivityViewController *activityController = [[UIActivityViewController alloc] initWithActivityItems:@[[NSURL fileURLWithPath:fileName.toNSString()]] applicationActivities:nil];