diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 24cc61e37..2c3702355 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -366,6 +366,14 @@
android:name=".devices.pinetime.PineTimeDFUService"
android:label="PineTime Nordic DFU service" />
+
+
+
+
+
+
diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/appmanager/AbstractAppManagerFragment.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/appmanager/AbstractAppManagerFragment.java
index 89aa71bd1..60d9fc3e5 100644
--- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/appmanager/AbstractAppManagerFragment.java
+++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/appmanager/AbstractAppManagerFragment.java
@@ -441,8 +441,8 @@ public abstract class AbstractAppManagerFragment extends Fragment {
pm.getPackageInfo("ru.gelin.android.weather.notification", PackageManager.GET_ACTIVITIES);
menu.removeItem(R.id.appmanager_weather_install_provider);
} catch (PackageManager.NameNotFoundException e) {
- menu.removeItem(R.id.appmanager_weather_activate);
- menu.removeItem(R.id.appmanager_weather_deactivate);
+ //menu.removeItem(R.id.appmanager_weather_activate);
+ //menu.removeItem(R.id.appmanager_weather_deactivate);
}
}
diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/GenericWeatherReceiver.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/GenericWeatherReceiver.java
new file mode 100644
index 000000000..ba76dc30e
--- /dev/null
+++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/GenericWeatherReceiver.java
@@ -0,0 +1,102 @@
+/* Copyright (C) 2020 Andreas Shimokawa
+
+ This file is part of Gadgetbridge.
+
+ Gadgetbridge is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published
+ by the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Gadgetbridge 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 Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see . */
+
+package nodomain.freeyourgadget.gadgetbridge.externalevents;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import android.widget.Toast;
+
+import org.json.JSONArray;
+import org.json.JSONObject;
+
+import java.util.ArrayList;
+
+import nodomain.freeyourgadget.gadgetbridge.GBApplication;
+import nodomain.freeyourgadget.gadgetbridge.model.Weather;
+import nodomain.freeyourgadget.gadgetbridge.model.WeatherSpec;
+import nodomain.freeyourgadget.gadgetbridge.util.GB;
+
+public class GenericWeatherReceiver extends BroadcastReceiver {
+ public final static String ACTION_GENERIC_WEATHER = "nodomain.freeyourgadget.gadgetbridge.ACTION_GENERIC_WEATHER";
+ public final static String EXTRA_WEATHER_JSON = "WeatherJson";
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (intent != null && ACTION_GENERIC_WEATHER.equals(intent.getAction())) {
+ Bundle bundle = intent.getExtras();
+ if (bundle != null && bundle.containsKey(EXTRA_WEATHER_JSON)) {
+ try {
+ JSONObject weatherJson = new JSONObject(bundle.getString(EXTRA_WEATHER_JSON));
+
+ WeatherSpec weatherSpec = new WeatherSpec();
+
+ weatherSpec.timestamp = safelyGet(weatherJson, Integer.class, "timestamp", (int) (System.currentTimeMillis() / 1000));
+ weatherSpec.location = safelyGet(weatherJson, String.class, "location", "");
+ weatherSpec.currentTemp = safelyGet(weatherJson, Integer.class, "currentTemp", 0);
+ weatherSpec.todayMinTemp = safelyGet(weatherJson, Integer.class, "todayMinTemp", 0);
+ weatherSpec.todayMaxTemp = safelyGet(weatherJson, Integer.class, "todayMaxTemp", 0);
+ weatherSpec.currentCondition = safelyGet(weatherJson, String.class, "currentCondition", "");
+ weatherSpec.currentConditionCode = safelyGet(weatherJson, Integer.class, "currentConditionCode", 0);
+ weatherSpec.currentHumidity = safelyGet(weatherJson, Integer.class, "currentHumidity", 0);
+ weatherSpec.windSpeed = safelyGet(weatherJson, Float.class, "windSpeed", 0f);
+ weatherSpec.windDirection = safelyGet(weatherJson, Integer.class, "windDirection", 0);
+
+ if (weatherJson.has("forecasts")) {
+ JSONArray forecastArray = weatherJson.getJSONArray("forecasts");
+ weatherSpec.forecasts = new ArrayList<>();
+
+ for (int i = 0, l = forecastArray.length(); i < l; i++) {
+ JSONObject forecastJson = forecastArray.getJSONObject(i);
+
+ WeatherSpec.Forecast forecast = new WeatherSpec.Forecast();
+
+ forecast.conditionCode = safelyGet(forecastJson, Integer.class, "conditionCode", 0);
+ forecast.humidity = safelyGet(forecastJson, Integer.class, "humidity", 0);
+ forecast.maxTemp = safelyGet(forecastJson, Integer.class, "maxTemp", 0);
+ forecast.minTemp = safelyGet(forecastJson, Integer.class, "minTemp", 0);
+
+ weatherSpec.forecasts.add(forecast);
+ }
+ }
+
+ Weather.getInstance().setWeatherSpec(weatherSpec);
+ GBApplication.deviceService().onSendWeather(weatherSpec);
+ } catch (Exception e) {
+ GB.toast("Gadgetbridge received broken or incompatible weather data", Toast.LENGTH_SHORT, GB.ERROR, e);
+ }
+ }
+ }
+ }
+
+ private T safelyGet(JSONObject jsonObject, Class tClass, String name, T defaultValue) {
+ try {
+ if (jsonObject.has(name)) {
+ Object value = jsonObject.get(name);
+
+ if (tClass.isInstance(value)) {
+ return (T) value;
+ }
+ }
+ } catch (Exception e) {
+ //
+ }
+ return defaultValue;
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/DeviceCommunicationService.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/DeviceCommunicationService.java
index 20697775e..2b4f8315c 100644
--- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/DeviceCommunicationService.java
+++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/DeviceCommunicationService.java
@@ -62,6 +62,7 @@ import nodomain.freeyourgadget.gadgetbridge.externalevents.BluetoothPairingReque
import nodomain.freeyourgadget.gadgetbridge.externalevents.CMWeatherReceiver;
import nodomain.freeyourgadget.gadgetbridge.externalevents.CalendarReceiver;
import nodomain.freeyourgadget.gadgetbridge.externalevents.DeviceSettingsReceiver;
+import nodomain.freeyourgadget.gadgetbridge.externalevents.GenericWeatherReceiver;
import nodomain.freeyourgadget.gadgetbridge.externalevents.LineageOsWeatherReceiver;
import nodomain.freeyourgadget.gadgetbridge.externalevents.MusicPlaybackReceiver;
import nodomain.freeyourgadget.gadgetbridge.externalevents.OmniJawsObserver;
@@ -327,6 +328,7 @@ public class DeviceCommunicationService extends Service implements SharedPrefere
private CMWeatherReceiver mCMWeatherReceiver = null;
private LineageOsWeatherReceiver mLineageOsWeatherReceiver = null;
private TinyWeatherForecastGermanyReceiver mTinyWeatherForecastGermanyReceiver = null;
+ private GenericWeatherReceiver mGenericWeatherReceiver = null;
private OmniJawsObserver mOmniJawsObserver = null;
private final DeviceSettingsReceiver deviceSettingsReceiver = new DeviceSettingsReceiver();
@@ -1188,6 +1190,10 @@ public class DeviceCommunicationService extends Service implements SharedPrefere
mTinyWeatherForecastGermanyReceiver = new TinyWeatherForecastGermanyReceiver();
registerReceiver(mTinyWeatherForecastGermanyReceiver, new IntentFilter("de.kaffeemitkoffein.broadcast.WEATHERDATA"));
}
+ if (mGenericWeatherReceiver == null) {
+ mGenericWeatherReceiver = new GenericWeatherReceiver();
+ registerReceiver(mGenericWeatherReceiver, new IntentFilter(GenericWeatherReceiver.ACTION_GENERIC_WEATHER));
+ }
if (mOmniJawsObserver == null) {
try {
mOmniJawsObserver = new OmniJawsObserver(new Handler());
@@ -1253,6 +1259,10 @@ public class DeviceCommunicationService extends Service implements SharedPrefere
unregisterReceiver(mGBAutoFetchReceiver);
mGBAutoFetchReceiver = null;
}
+ if (mGenericWeatherReceiver != null) {
+ unregisterReceiver(mGenericWeatherReceiver);
+ mGenericWeatherReceiver = null;
+ }
}
}