From 2b15ad34aa918f5c9ce0e36ca5a13d2b7f557b49 Mon Sep 17 00:00:00 2001 From: Michael Zanetti Date: Wed, 7 Dec 2022 20:18:05 +0100 Subject: [PATCH] Add a check for location services being enabled in BtWiFi setup --- nymea-app/nymea-app.pro | 2 ++ nymea-app/platformhelper.cpp | 5 +++ nymea-app/platformhelper.h | 4 +++ .../io/guh/nymeaapp/NymeaAppActivity.java | 34 +++++++++++++++++++ .../nymeaapp/NymeaAppBroadcastReceiver.java | 20 +++++++++++ .../android/platformhelperandroid.cpp | 23 +++++++++++++ .../android/platformhelperandroid.h | 3 ++ nymea-app/ui/connection/ConnectionWizard.qml | 15 ++++++-- 8 files changed, 103 insertions(+), 3 deletions(-) create mode 100644 nymea-app/platformintegration/android/java/io/guh/nymeaapp/NymeaAppBroadcastReceiver.java diff --git a/nymea-app/nymea-app.pro b/nymea-app/nymea-app.pro index 57a4450f..1de41048 100644 --- a/nymea-app/nymea-app.pro +++ b/nymea-app/nymea-app.pro @@ -218,3 +218,5 @@ win32 { target.path = /usr/bin INSTALLS += target +DISTFILES += + diff --git a/nymea-app/platformhelper.cpp b/nymea-app/platformhelper.cpp index 39fba57c..f3b30a93 100644 --- a/nymea-app/platformhelper.cpp +++ b/nymea-app/platformhelper.cpp @@ -239,6 +239,11 @@ void PlatformHelper::shareFile(const QString &fileName) QDesktopServices::openUrl(QUrl(fileName)); } +bool PlatformHelper::locationServicesEnabled() const +{ + return true; +} + QObject *PlatformHelper::platformHelperProvider(QQmlEngine *engine, QJSEngine *scriptEngine) { Q_UNUSED(engine) diff --git a/nymea-app/platformhelper.h b/nymea-app/platformhelper.h index e15e4495..31810d54 100644 --- a/nymea-app/platformhelper.h +++ b/nymea-app/platformhelper.h @@ -57,6 +57,7 @@ class PlatformHelper : public QObject Q_PROPERTY(QColor bottomPanelColor READ bottomPanelColor WRITE setBottomPanelColor NOTIFY bottomPanelColorChanged) Q_PROPERTY(bool darkModeEnabled READ darkModeEnabled NOTIFY darkModeEnabledChanged) Q_PROPERTY(QVariantList pendingNotificationActions READ pendingNotificationActions NOTIFY pendingNotificationActionsChanged) + Q_PROPERTY(bool locationServicesEnabled READ locationServicesEnabled NOTIFY locationServicesEnabledChanged) public: enum HapticsFeedback { @@ -108,6 +109,8 @@ public: void notificationActionReceived(const QString &nymeaData); + virtual bool locationServicesEnabled() const; + signals: void screenTimeoutChanged(); void screenBrightnessChanged(); @@ -116,6 +119,7 @@ signals: void darkModeEnabledChanged(); void splashVisibleChanged(); void pendingNotificationActionsChanged(); + void locationServicesEnabledChanged(); protected: explicit PlatformHelper(QObject *parent = nullptr); 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 6d1552a3..82235c6c 100644 --- a/nymea-app/platformintegration/android/java/io/guh/nymeaapp/NymeaAppActivity.java +++ b/nymea-app/platformintegration/android/java/io/guh/nymeaapp/NymeaAppActivity.java @@ -13,6 +13,9 @@ import android.os.Vibrator; import android.net.Uri; import android.support.v4.content.FileProvider; import android.content.res.Configuration; +import android.content.IntentFilter; +import android.content.BroadcastReceiver; +import android.location.LocationManager; public class NymeaAppActivity extends org.qtproject.qt5.android.bindings.QtActivity { @@ -21,6 +24,17 @@ public class NymeaAppActivity extends org.qtproject.qt5.android.bindings.QtActiv private static native void darkModeEnabledChangedJNI(); private static native void notificationActionReceivedJNI(String data); + private static native void locationServicesEnabledChangedJNI(); + + private BroadcastReceiver m_gpsSwitchStateReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + Log.i(TAG, "**** Intent received!!!" + intent.getAction()); + if (LocationManager.MODE_CHANGED_ACTION.equals(intent.getAction())) { + locationServicesEnabledChangedJNI(); + } + } + }; @Override public void onCreate(Bundle savedInstanceState) { @@ -37,6 +51,21 @@ public class NymeaAppActivity extends org.qtproject.qt5.android.bindings.QtActiv } } + @Override + public void onResume() { + super.onResume(); + + IntentFilter filter = new IntentFilter(LocationManager.MODE_CHANGED_ACTION); +// filter.addAction(Intent.ACTION_PROVIDER_CHANGED); + registerReceiver(m_gpsSwitchStateReceiver, filter); + } + + @Override + public void onPause() { + super.onPause(); + unregisterReceiver(m_gpsSwitchStateReceiver); + } + @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); @@ -93,4 +122,9 @@ public class NymeaAppActivity extends org.qtproject.qt5.android.bindings.QtActiv public boolean darkModeEnabled() { return (getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK) == Configuration.UI_MODE_NIGHT_YES; } + + public boolean locationServicesEnabled() { + LocationManager lm = (LocationManager)getApplicationContext().getSystemService(Context.LOCATION_SERVICE); + return lm.isLocationEnabled(); + } } diff --git a/nymea-app/platformintegration/android/java/io/guh/nymeaapp/NymeaAppBroadcastReceiver.java b/nymea-app/platformintegration/android/java/io/guh/nymeaapp/NymeaAppBroadcastReceiver.java new file mode 100644 index 00000000..5b195d9a --- /dev/null +++ b/nymea-app/platformintegration/android/java/io/guh/nymeaapp/NymeaAppBroadcastReceiver.java @@ -0,0 +1,20 @@ +package io.guh.nymeaapp; + +import android.util.Log; +import android.content.Context; +import android.content.Intent; +import android.app.PendingIntent; + +import android.content.BroadcastReceiver; + + +public class NymeaAppBroadcastReceiver extends BroadcastReceiver +{ + private static final String TAG = "nymea-app: BroadcastReceiver"; + + public void onReceive(Context context, Intent intent) { + String action = intent.getAction(); + Log.d(TAG, "Broadcast received: " + action); + + } +} diff --git a/nymea-app/platformintegration/android/platformhelperandroid.cpp b/nymea-app/platformintegration/android/platformhelperandroid.cpp index c4a88882..71f4341a 100644 --- a/nymea-app/platformintegration/android/platformhelperandroid.cpp +++ b/nymea-app/platformintegration/android/platformhelperandroid.cpp @@ -34,6 +34,7 @@ #include #include #include +#include // WindowManager.LayoutParams @@ -49,6 +50,7 @@ static PlatformHelperAndroid *m_instance = nullptr; 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*/) @@ -82,6 +84,13 @@ PlatformHelperAndroid::PlatformHelperAndroid(QObject *parent) : PlatformHelper(p if (!notificationData.isNull()) { notificationActionReceived(notificationData); } + + connect(qApp, &QApplication::applicationStateChanged, this, [this](Qt::ApplicationState state){ + qCritical() << "******* app state change"; + if (state == Qt::ApplicationActive) { + emit locationServicesEnabledChanged(); + } + }); } void PlatformHelperAndroid::hideSplashScreen() @@ -247,6 +256,12 @@ bool PlatformHelperAndroid::darkModeEnabled() const return QtAndroid::androidActivity().callMethod("darkModeEnabled"); } +bool PlatformHelperAndroid::locationServicesEnabled() const +{ + jboolean enabled = QtAndroid::androidActivity().callMethod("locationServicesEnabled", "()Z"); + return enabled; +} + void PlatformHelperAndroid::shareFile(const QString &fileName) { QtAndroid::androidActivity().callMethod("shareFile", "(Ljava/lang/String;)V", @@ -270,3 +285,11 @@ void PlatformHelperAndroid::notificationActionReceivedJNI(JNIEnv *env, jobject, platformHelper->notificationActionReceived(env->GetStringUTFChars(data, nullptr)); } } + +void PlatformHelperAndroid::locationServicesEnabledChangedJNI() +{ + PlatformHelper* platformHelper = PlatformHelperAndroid::instance(false); + if (platformHelper) { + emit platformHelper->locationServicesEnabledChanged(); + } +} diff --git a/nymea-app/platformintegration/android/platformhelperandroid.h b/nymea-app/platformintegration/android/platformhelperandroid.h index 1420be17..c88fe6c6 100644 --- a/nymea-app/platformintegration/android/platformhelperandroid.h +++ b/nymea-app/platformintegration/android/platformhelperandroid.h @@ -62,10 +62,13 @@ public: bool darkModeEnabled() const override; + bool locationServicesEnabled() const override; + void shareFile(const QString &fileName) override; static void darkModeEnabledChangedJNI(); static void notificationActionReceivedJNI(JNIEnv *env, jobject /*thiz*/, jstring data); + static void locationServicesEnabledChangedJNI(); private: static void permissionRequestFinished(const QtAndroid::PermissionResultMap &); diff --git a/nymea-app/ui/connection/ConnectionWizard.qml b/nymea-app/ui/connection/ConnectionWizard.qml index c4ed4cba..a2120865 100644 --- a/nymea-app/ui/connection/ConnectionWizard.qml +++ b/nymea-app/ui/connection/ConnectionWizard.qml @@ -491,7 +491,7 @@ WizardPageBase { BluetoothDiscovery { id: bluetoothDiscovery - discoveryEnabled: pageStack.currentItem === wirelessBluetoothDiscoveryPage + discoveryEnabled: pageStack.currentItem === wirelessBluetoothDiscoveryPage && PlatformHelper.locationServicesEnabled } content: ListView { @@ -510,7 +510,7 @@ WizardPageBase { BusyIndicator { anchors.centerIn: parent - visible: bluetoothDiscovery.discovering && deviceInfosProxy.count == 0 + visible: bluetoothDiscovery.discovering && deviceInfosProxy.count == 0 && bluetoothDiscovery.bluetoothAvailable && bluetoothDiscovery.bluetoothEnabled && PlatformHelper.locationServicesEnabled } delegate: NymeaSwipeDelegate { @@ -529,7 +529,7 @@ WizardPageBase { width: parent.width - Style.margins * 2 anchors.centerIn: parent spacing: Style.bigMargins - visible: !bluetoothDiscovery.bluetoothAvailable || !bluetoothDiscovery.bluetoothEnabled + visible: !bluetoothDiscovery.bluetoothAvailable || !bluetoothDiscovery.bluetoothEnabled || !PlatformHelper.locationServicesEnabled ColorIcon { name: "/ui/images/connections/bluetooth.svg" @@ -542,10 +542,19 @@ WizardPageBase { Layout.fillWidth: true horizontalAlignment: Text.AlignHCenter wrapMode: Text.WordWrap + visible: !bluetoothDiscovery.bluetoothAvailable || !bluetoothDiscovery.bluetoothEnabled text: !bluetoothDiscovery.bluetoothAvailable ? qsTr("Bluetooth doesn't seem to be available on this system.") : qsTr("Bluetooth is turned off. Please enable Bluetooth on this device.") } + + Label { + Layout.fillWidth: true + horizontalAlignment: Text.AlignHCenter + wrapMode: Text.WordWrap + visible: !PlatformHelper.locationServicesEnabled + text: qsTr("Location services are disabled. Please enable location services on this device in order to search for nearby nymea:energy gateways.") + } } }