diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 6bfd292b9..6e962b68c 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -24,6 +24,8 @@
+
+
. */
+package nodomain.freeyourgadget.gadgetbridge.externalevents;
+
+import android.app.AlarmManager;
+import android.app.PendingIntent;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.SharedPreferences;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.List;
+
+import lineageos.weather.LineageWeatherManager;
+import lineageos.weather.WeatherInfo;
+import lineageos.weather.WeatherLocation;
+import lineageos.weather.util.WeatherUtils;
+import nodomain.freeyourgadget.gadgetbridge.BuildConfig;
+import nodomain.freeyourgadget.gadgetbridge.GBApplication;
+import nodomain.freeyourgadget.gadgetbridge.model.Weather;
+import nodomain.freeyourgadget.gadgetbridge.model.WeatherSpec;
+import nodomain.freeyourgadget.gadgetbridge.util.Prefs;
+
+import static lineageos.providers.WeatherContract.WeatherColumns.TempUnit.FAHRENHEIT;
+import static lineageos.providers.WeatherContract.WeatherColumns.WeatherCode.ISOLATED_THUNDERSHOWERS;
+import static lineageos.providers.WeatherContract.WeatherColumns.WeatherCode.NOT_AVAILABLE;
+import static lineageos.providers.WeatherContract.WeatherColumns.WeatherCode.SCATTERED_SNOW_SHOWERS;
+import static lineageos.providers.WeatherContract.WeatherColumns.WeatherCode.SCATTERED_THUNDERSTORMS;
+import static lineageos.providers.WeatherContract.WeatherColumns.WeatherCode.SHOWERS;
+import static lineageos.providers.WeatherContract.WeatherColumns.WindSpeedUnit.MPH;
+
+public class LineageOsWeatherReceiver extends BroadcastReceiver implements LineageWeatherManager.WeatherUpdateRequestListener, LineageWeatherManager.LookupCityRequestListener {
+
+ private static final Logger LOG = LoggerFactory.getLogger(LineageOsWeatherReceiver.class);
+
+ private WeatherLocation weatherLocation = null;
+ private Context mContext;
+ private PendingIntent mPendingIntent = null;
+
+ public LineageOsWeatherReceiver() {
+ mContext = GBApplication.getContext();
+ final LineageWeatherManager weatherManager = LineageWeatherManager.getInstance(mContext);
+ if (weatherManager == null) {
+ return;
+ }
+
+ Prefs prefs = GBApplication.getPrefs();
+
+ String city = prefs.getString("weather_city", null);
+ String cityId = prefs.getString("weather_cityid", null);
+
+ if ((cityId == null || cityId.equals("")) && city != null && !city.equals("")) {
+ lookupCity(city);
+ } else if (city != null && cityId != null) {
+ weatherLocation = new WeatherLocation.Builder(cityId, city).build();
+ enablePeriodicAlarm(true);
+ }
+ }
+
+ private void lookupCity(String city) {
+ final LineageWeatherManager weatherManager = LineageWeatherManager.getInstance(mContext);
+ if (weatherManager == null) {
+ return;
+ }
+
+ if (city != null && !city.equals("")) {
+ if (weatherManager.getActiveWeatherServiceProviderLabel() != null) {
+ weatherManager.lookupCity(city, this);
+ }
+ }
+ }
+
+ private void enablePeriodicAlarm(boolean enable) {
+ if ((mPendingIntent != null && enable) || (mPendingIntent == null && !enable)) {
+ return;
+ }
+
+ AlarmManager am = (AlarmManager) (mContext.getSystemService(Context.ALARM_SERVICE));
+ if (am == null) {
+ LOG.warn("could not get alarm manager!");
+ return;
+ }
+
+ if (enable) {
+ Intent intent = new Intent("GB_UPDATE_WEATHER");
+ intent.setPackage(BuildConfig.APPLICATION_ID);
+ mPendingIntent = PendingIntent.getBroadcast(mContext, 0, intent, 0);
+ am.setInexactRepeating(AlarmManager.RTC_WAKEUP, Calendar.getInstance().getTimeInMillis() + 10000, AlarmManager.INTERVAL_HOUR, mPendingIntent);
+ } else {
+ am.cancel(mPendingIntent);
+ mPendingIntent = null;
+ }
+ }
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ Prefs prefs = GBApplication.getPrefs();
+
+ String city = prefs.getString("weather_city", null);
+ String cityId = prefs.getString("weather_cityid", null);
+
+ if (city != null && !city.equals("") && cityId == null) {
+ lookupCity(city);
+ } else {
+ requestWeather();
+ }
+ }
+
+ private void requestWeather() {
+ final LineageWeatherManager weatherManager = LineageWeatherManager.getInstance(GBApplication.getContext());
+ if (weatherManager.getActiveWeatherServiceProviderLabel() != null && weatherLocation != null) {
+ weatherManager.requestWeatherUpdate(weatherLocation, this);
+ }
+ }
+
+ @Override
+ public void onWeatherRequestCompleted(int status, WeatherInfo weatherInfo) {
+ if (weatherInfo != null) {
+ LOG.info("weather: " + weatherInfo.toString());
+ WeatherSpec weatherSpec = new WeatherSpec();
+ weatherSpec.timestamp = (int) (weatherInfo.getTimestamp() / 1000);
+ weatherSpec.location = weatherInfo.getCity();
+
+ if (weatherInfo.getTemperatureUnit() == FAHRENHEIT) {
+ weatherSpec.currentTemp = (int) WeatherUtils.fahrenheitToCelsius(weatherInfo.getTemperature()) + 273;
+ weatherSpec.todayMaxTemp = (int) WeatherUtils.fahrenheitToCelsius(weatherInfo.getTodaysHigh()) + 273;
+ weatherSpec.todayMinTemp = (int) WeatherUtils.fahrenheitToCelsius(weatherInfo.getTodaysLow()) + 273;
+ } else {
+ weatherSpec.currentTemp = (int) weatherInfo.getTemperature() + 273;
+ weatherSpec.todayMaxTemp = (int) weatherInfo.getTodaysHigh() + 273;
+ weatherSpec.todayMinTemp = (int) weatherInfo.getTodaysLow() + 273;
+ }
+ if (weatherInfo.getWindSpeedUnit() == MPH) {
+ weatherSpec.windSpeed = (float) weatherInfo.getWindSpeed() * 1.609344f;
+ } else {
+ weatherSpec.windSpeed = (float) weatherInfo.getWindSpeed();
+ }
+ weatherSpec.windDirection = (int) weatherInfo.getWindDirection();
+
+ weatherSpec.currentConditionCode = Weather.mapToOpenWeatherMapCondition(LineageOstoYahooCondintion(weatherInfo.getConditionCode()));
+ weatherSpec.currentCondition = Weather.getConditionString(weatherSpec.currentConditionCode);
+ weatherSpec.currentHumidity = (int) weatherInfo.getHumidity();
+
+ weatherSpec.forecasts = new ArrayList<>();
+ List forecasts = weatherInfo.getForecasts();
+ for (int i = 1; i < forecasts.size(); i++) {
+ WeatherInfo.DayForecast cmForecast = forecasts.get(i);
+ WeatherSpec.Forecast gbForecast = new WeatherSpec.Forecast();
+ if (weatherInfo.getTemperatureUnit() == FAHRENHEIT) {
+ gbForecast.maxTemp = (int) WeatherUtils.fahrenheitToCelsius(cmForecast.getHigh()) + 273;
+ gbForecast.minTemp = (int) WeatherUtils.fahrenheitToCelsius(cmForecast.getLow()) + 273;
+ } else {
+ gbForecast.maxTemp = (int) cmForecast.getHigh() + 273;
+ gbForecast.minTemp = (int) cmForecast.getLow() + 273;
+ }
+ gbForecast.conditionCode = Weather.mapToOpenWeatherMapCondition(LineageOstoYahooCondintion(cmForecast.getConditionCode()));
+ weatherSpec.forecasts.add(gbForecast);
+ }
+ Weather.getInstance().setWeatherSpec(weatherSpec);
+ GBApplication.deviceService().onSendWeather(weatherSpec);
+ } else {
+ LOG.info("request has returned null for WeatherInfo");
+ }
+ }
+
+ /**
+ * @param cmCondition
+ * @return
+ */
+ private int LineageOstoYahooCondintion(int cmCondition) {
+ int yahooCondition;
+ if (cmCondition <= SHOWERS) {
+ yahooCondition = cmCondition;
+ } else if (cmCondition <= SCATTERED_THUNDERSTORMS) {
+ yahooCondition = cmCondition + 1;
+ } else if (cmCondition <= SCATTERED_SNOW_SHOWERS) {
+ yahooCondition = cmCondition + 2;
+ } else if (cmCondition <= ISOLATED_THUNDERSHOWERS) {
+ yahooCondition = cmCondition + 3;
+ } else {
+ yahooCondition = NOT_AVAILABLE;
+ }
+ return yahooCondition;
+ }
+
+ @Override
+ public void onLookupCityRequestCompleted(int result, List list) {
+ if (list != null) {
+ weatherLocation = list.get(0);
+ String cityId = weatherLocation.getCityId();
+ String city = weatherLocation.getCity();
+
+ SharedPreferences.Editor editor = GBApplication.getPrefs().getPreferences().edit();
+ editor.putString("weather_city", city).apply();
+ editor.putString("weather_cityid", cityId).apply();
+ enablePeriodicAlarm(true);
+ requestWeather();
+ } else {
+ enablePeriodicAlarm(false);
+ }
+ }
+}
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 1a7876332..2ea7f740a 100644
--- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/DeviceCommunicationService.java
+++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/DeviceCommunicationService.java
@@ -56,6 +56,7 @@ import nodomain.freeyourgadget.gadgetbridge.externalevents.BluetoothConnectRecei
import nodomain.freeyourgadget.gadgetbridge.externalevents.BluetoothPairingRequestReceiver;
import nodomain.freeyourgadget.gadgetbridge.externalevents.CMWeatherReceiver;
import nodomain.freeyourgadget.gadgetbridge.externalevents.CalendarReceiver;
+import nodomain.freeyourgadget.gadgetbridge.externalevents.LineageOsWeatherReceiver;
import nodomain.freeyourgadget.gadgetbridge.externalevents.MusicPlaybackReceiver;
import nodomain.freeyourgadget.gadgetbridge.externalevents.OmniJawsObserver;
import nodomain.freeyourgadget.gadgetbridge.externalevents.PebbleReceiver;
@@ -193,6 +194,7 @@ public class DeviceCommunicationService extends Service implements SharedPrefere
private AlarmReceiver mAlarmReceiver = null;
private CalendarReceiver mCalendarReceiver = null;
private CMWeatherReceiver mCMWeatherReceiver = null;
+ private LineageOsWeatherReceiver mLineageOsWeatherReceiver = null;
private OmniJawsObserver mOmniJawsObserver = null;
private Random mRandom = new Random();
@@ -733,6 +735,10 @@ public class DeviceCommunicationService extends Service implements SharedPrefere
mCMWeatherReceiver = new CMWeatherReceiver();
registerReceiver(mCMWeatherReceiver, new IntentFilter("GB_UPDATE_WEATHER"));
}
+ if (mLineageOsWeatherReceiver == null && coordinator != null && coordinator.supportsWeather()) {
+ mLineageOsWeatherReceiver = new LineageOsWeatherReceiver();
+ registerReceiver(mLineageOsWeatherReceiver, new IntentFilter("GB_UPDATE_WEATHER"));
+ }
if (mOmniJawsObserver == null && coordinator != null && coordinator.supportsWeather()) {
try {
mOmniJawsObserver = new OmniJawsObserver(new Handler());
@@ -784,6 +790,10 @@ public class DeviceCommunicationService extends Service implements SharedPrefere
unregisterReceiver(mCMWeatherReceiver);
mCMWeatherReceiver = null;
}
+ if (mLineageOsWeatherReceiver != null) {
+ unregisterReceiver(mLineageOsWeatherReceiver);
+ mLineageOsWeatherReceiver = null;
+ }
if (mOmniJawsObserver != null) {
getContentResolver().unregisterContentObserver(mOmniJawsObserver);
}