diff --git a/app/build.gradle b/app/build.gradle
index 790699e9c..b02e76497 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -83,6 +83,7 @@ dependencies {
// version contains way too much and our custom patches are in the generator only.
compile 'org.greenrobot:greendao:2.2.1'
compile 'org.apache.commons:commons-lang3:3.5'
+ compile 'org.cyanogenmod:platform.sdk:6.0'
// compile project(":DaoCore")
}
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 49ae11746..c7e41ddc4 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -19,6 +19,9 @@
+
+
+
diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/SettingsActivity.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/SettingsActivity.java
index fb8a6b388..cc8a5144f 100644
--- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/SettingsActivity.java
+++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/SettingsActivity.java
@@ -47,6 +47,7 @@ import nodomain.freeyourgadget.gadgetbridge.GBApplication;
import nodomain.freeyourgadget.gadgetbridge.R;
import nodomain.freeyourgadget.gadgetbridge.devices.DeviceManager;
import nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandPreferencesActivity;
+import nodomain.freeyourgadget.gadgetbridge.externalevents.CMWeatherReceiver;
import nodomain.freeyourgadget.gadgetbridge.model.CannedMessagesSpec;
import nodomain.freeyourgadget.gadgetbridge.util.FileUtils;
import nodomain.freeyourgadget.gadgetbridge.util.GB;
@@ -259,6 +260,21 @@ public class SettingsActivity extends AbstractSettingsActivity {
}
});
+ pref = findPreference("weather_city");
+ pref.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
+ @Override
+ public boolean onPreferenceChange(Preference preference, Object newVal) {
+ // reset city id and force a new lookup
+ GBApplication.getPrefs().getPreferences().edit().putString("weather_cityid",null).apply();
+ preference.setSummary(newVal.toString());
+ Intent intent = new Intent("GB_UPDATE_WEATHER");
+ intent.setPackage(CMWeatherReceiver.class.getCanonicalName());
+ sendBroadcast(intent);
+ return true;
+ }
+
+ });
+
// Get all receivers of Media Buttons
Intent mediaButtonIntent = new Intent(Intent.ACTION_MEDIA_BUTTON);
@@ -338,6 +354,7 @@ public class SettingsActivity extends AbstractSettingsActivity {
PREF_USER_WEIGHT_KG,
PREF_USER_SLEEP_DURATION,
PREF_USER_STEPS_GOAL,
+ "weather_city",
};
}
diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/DeviceCoordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/DeviceCoordinator.java
index 91ed1df3b..a1cdabf23 100644
--- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/DeviceCoordinator.java
+++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/DeviceCoordinator.java
@@ -228,5 +228,10 @@ public interface DeviceCoordinator {
* This can be live HR, steps etc.
*/
boolean supportsRealtimeData();
-
+
+ /**
+ * Indicates whether the device supports current weather and/or weather
+ * forecast display.
+ */
+ boolean supportsWeather();
}
diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/UnknownDeviceCoordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/UnknownDeviceCoordinator.java
index b470c6ec4..3b9b7d9d4 100644
--- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/UnknownDeviceCoordinator.java
+++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/UnknownDeviceCoordinator.java
@@ -176,4 +176,9 @@ public class UnknownDeviceCoordinator extends AbstractDeviceCoordinator {
public boolean supportsRealtimeData() {
return false;
}
+
+ @Override
+ public boolean supportsWeather() {
+ return false;
+ }
}
diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/hplus/HPlusCoordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/hplus/HPlusCoordinator.java
index 157c6e54f..0cce909b3 100644
--- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/hplus/HPlusCoordinator.java
+++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/hplus/HPlusCoordinator.java
@@ -98,6 +98,11 @@ public class HPlusCoordinator extends AbstractDeviceCoordinator {
return true;
}
+ @Override
+ public boolean supportsWeather() {
+ return false;
+ }
+
@Override
public DeviceType getDeviceType() {
return DeviceType.HPLUS;
diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/amazfitbip/AmazfitBipCoordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/amazfitbip/AmazfitBipCoordinator.java
index 812f34cdb..449054b37 100644
--- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/amazfitbip/AmazfitBipCoordinator.java
+++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/amazfitbip/AmazfitBipCoordinator.java
@@ -63,4 +63,9 @@ public class AmazfitBipCoordinator extends HuamiCoordinator {
public boolean supportsHeartRateMeasurement(GBDevice device) {
return true;
}
+
+ @Override
+ public boolean supportsWeather() {
+ return true;
+ }
}
diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/amazfitcor/AmazfitCorCoordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/amazfitcor/AmazfitCorCoordinator.java
index 978c27333..97dfa098e 100644
--- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/amazfitcor/AmazfitCorCoordinator.java
+++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/amazfitcor/AmazfitCorCoordinator.java
@@ -63,4 +63,9 @@ public class AmazfitCorCoordinator extends HuamiCoordinator {
public boolean supportsHeartRateMeasurement(GBDevice device) {
return true;
}
+
+ @Override
+ public boolean supportsWeather() {
+ return true;
+ }
}
diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/miband2/MiBand2Coordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/miband2/MiBand2Coordinator.java
index af1ce8939..e1d091102 100644
--- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/miband2/MiBand2Coordinator.java
+++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/miband2/MiBand2Coordinator.java
@@ -73,4 +73,9 @@ public class MiBand2Coordinator extends HuamiCoordinator {
public boolean supportsHeartRateMeasurement(GBDevice device) {
return true;
}
+
+ @Override
+ public boolean supportsWeather() {
+ return false;
+ }
}
diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/miband2/MiBand2HRXCoordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/miband2/MiBand2HRXCoordinator.java
index ef5231c55..ea4f39841 100644
--- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/miband2/MiBand2HRXCoordinator.java
+++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/huami/miband2/MiBand2HRXCoordinator.java
@@ -68,4 +68,9 @@ public class MiBand2HRXCoordinator extends HuamiCoordinator {
return false;
}
+ @Override
+ public boolean supportsWeather() {
+ return false;
+ }
+
}
diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/jyou/TeclastH30Coordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/jyou/TeclastH30Coordinator.java
index 0327ab0fc..b35b1d404 100644
--- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/jyou/TeclastH30Coordinator.java
+++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/jyou/TeclastH30Coordinator.java
@@ -84,6 +84,11 @@ public class TeclastH30Coordinator extends AbstractDeviceCoordinator {
return true;
}
+ @Override
+ public boolean supportsWeather() {
+ return false;
+ }
+
@Override
public DeviceType getDeviceType() {
return DeviceType.TECLASTH30;
diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/liveview/LiveviewCoordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/liveview/LiveviewCoordinator.java
index 13eb07305..1e3c716e1 100644
--- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/liveview/LiveviewCoordinator.java
+++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/liveview/LiveviewCoordinator.java
@@ -23,7 +23,6 @@ import android.net.Uri;
import android.support.annotation.NonNull;
import nodomain.freeyourgadget.gadgetbridge.GBException;
-import nodomain.freeyourgadget.gadgetbridge.R;
import nodomain.freeyourgadget.gadgetbridge.devices.AbstractDeviceCoordinator;
import nodomain.freeyourgadget.gadgetbridge.devices.InstallHandler;
import nodomain.freeyourgadget.gadgetbridge.devices.SampleProvider;
@@ -35,6 +34,7 @@ import nodomain.freeyourgadget.gadgetbridge.model.ActivitySample;
import nodomain.freeyourgadget.gadgetbridge.model.DeviceType;
public class LiveviewCoordinator extends AbstractDeviceCoordinator {
+ @NonNull
@Override
public DeviceType getSupportedType(GBDeviceCandidate candidate) {
String name = candidate.getDevice().getName();
@@ -119,6 +119,11 @@ public class LiveviewCoordinator extends AbstractDeviceCoordinator {
return false;
}
+ @Override
+ public boolean supportsWeather() {
+ return false;
+ }
+
@Override
protected void deleteDevice(@NonNull GBDevice gbDevice, @NonNull Device device, @NonNull DaoSession session) throws GBException {
// nothing to delete, yet
diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/miband/MiBandCoordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/miband/MiBandCoordinator.java
index b23be5b22..2cd04f320 100644
--- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/miband/MiBandCoordinator.java
+++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/miband/MiBandCoordinator.java
@@ -171,6 +171,11 @@ public class MiBandCoordinator extends AbstractDeviceCoordinator {
return true;
}
+ @Override
+ public boolean supportsWeather() {
+ return false;
+ }
+
public static boolean hasValidUserInfo() {
String dummyMacAddress = MiBandService.MAC_ADDRESS_FILTER_1_1A + ":00:00:00";
try {
diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/no1f1/No1F1Coordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/no1f1/No1F1Coordinator.java
index 5499d1c57..fb157b677 100644
--- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/no1f1/No1F1Coordinator.java
+++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/no1f1/No1F1Coordinator.java
@@ -147,6 +147,11 @@ public class No1F1Coordinator extends AbstractDeviceCoordinator {
return false;
}
+ @Override
+ public boolean supportsWeather() {
+ return false;
+ }
+
@Override
protected void deleteDevice(@NonNull GBDevice gbDevice, @NonNull Device device, @NonNull DaoSession session) throws GBException {
Long deviceId = device.getId();
diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/pebble/PebbleCoordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/pebble/PebbleCoordinator.java
index b764c63e4..eefac58cf 100644
--- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/pebble/PebbleCoordinator.java
+++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/pebble/PebbleCoordinator.java
@@ -155,4 +155,9 @@ public class PebbleCoordinator extends AbstractDeviceCoordinator {
public boolean supportsRealtimeData() {
return false;
}
+
+ @Override
+ public boolean supportsWeather() {
+ return true;
+ }
}
diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/vibratissimo/VibratissimoCoordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/vibratissimo/VibratissimoCoordinator.java
index 84dc61a46..b43c5fb37 100644
--- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/vibratissimo/VibratissimoCoordinator.java
+++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/vibratissimo/VibratissimoCoordinator.java
@@ -120,6 +120,11 @@ public class VibratissimoCoordinator extends AbstractDeviceCoordinator {
return false; // hmmm well, it has a temperature sensor :D
}
+ @Override
+ public boolean supportsWeather() {
+ return false;
+ }
+
@Override
protected void deleteDevice(@NonNull GBDevice gbDevice, @NonNull Device device, @NonNull DaoSession session) throws GBException {
// nothing to delete, yet
diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/CMWeatherReceiver.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/CMWeatherReceiver.java
new file mode 100644
index 000000000..2513956af
--- /dev/null
+++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/CMWeatherReceiver.java
@@ -0,0 +1,194 @@
+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 cyanogenmod.weather.CMWeatherManager;
+import cyanogenmod.weather.WeatherInfo;
+import cyanogenmod.weather.WeatherLocation;
+import cyanogenmod.weather.util.WeatherUtils;
+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 cyanogenmod.providers.WeatherContract.WeatherColumns.TempUnit.FAHRENHEIT;
+import static cyanogenmod.providers.WeatherContract.WeatherColumns.WeatherCode.ISOLATED_THUNDERSHOWERS;
+import static cyanogenmod.providers.WeatherContract.WeatherColumns.WeatherCode.NOT_AVAILABLE;
+import static cyanogenmod.providers.WeatherContract.WeatherColumns.WeatherCode.SCATTERED_SNOW_SHOWERS;
+import static cyanogenmod.providers.WeatherContract.WeatherColumns.WeatherCode.SCATTERED_THUNDERSTORMS;
+import static cyanogenmod.providers.WeatherContract.WeatherColumns.WeatherCode.SHOWERS;
+
+public class CMWeatherReceiver extends BroadcastReceiver implements CMWeatherManager.WeatherUpdateRequestListener, CMWeatherManager.LookupCityRequestListener {
+
+ private static final Logger LOG = LoggerFactory.getLogger(CMWeatherReceiver.class);
+
+ private WeatherLocation weatherLocation = null;
+ private Context mContext;
+ private PendingIntent mPendingIntent = null;
+
+ public CMWeatherReceiver() {
+ mContext = GBApplication.getContext();
+ final CMWeatherManager weatherManager = CMWeatherManager.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 CMWeatherManager weatherManager = CMWeatherManager.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) {
+ mPendingIntent = PendingIntent.getBroadcast(mContext, 0, new Intent("GB_UPDATE_WEATHER"), 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 CMWeatherManager weatherManager = CMWeatherManager.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;
+ }
+
+ weatherSpec.currentConditionCode = Weather.mapToOpenWeatherMapCondition(CMtoYahooCondintion(weatherInfo.getConditionCode()));
+ weatherSpec.currentCondition = Weather.getConditionString(weatherSpec.currentConditionCode);
+
+ 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(CMtoYahooCondintion(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 CMtoYahooCondintion(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 f50ce7723..3b6c00799 100644
--- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/DeviceCommunicationService.java
+++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/DeviceCommunicationService.java
@@ -50,7 +50,7 @@ import nodomain.freeyourgadget.gadgetbridge.externalevents.AlarmClockReceiver;
import nodomain.freeyourgadget.gadgetbridge.externalevents.AlarmReceiver;
import nodomain.freeyourgadget.gadgetbridge.externalevents.BluetoothConnectReceiver;
import nodomain.freeyourgadget.gadgetbridge.externalevents.BluetoothPairingRequestReceiver;
-//import nodomain.freeyourgadget.gadgetbridge.externalevents.CMWeatherReceiver;
+import nodomain.freeyourgadget.gadgetbridge.externalevents.CMWeatherReceiver;
import nodomain.freeyourgadget.gadgetbridge.externalevents.CalendarReceiver;
import nodomain.freeyourgadget.gadgetbridge.externalevents.MusicPlaybackReceiver;
import nodomain.freeyourgadget.gadgetbridge.externalevents.PebbleReceiver;
@@ -174,7 +174,7 @@ public class DeviceCommunicationService extends Service implements SharedPrefere
private AlarmReceiver mAlarmReceiver = null;
private CalendarReceiver mCalendarReceiver = null;
- //private CMWeatherReceiver mCMWeatherReceiver = null;
+ private CMWeatherReceiver mCMWeatherReceiver = null;
private Random mRandom = new Random();
private final String[] mMusicActions = {
@@ -659,12 +659,10 @@ public class DeviceCommunicationService extends Service implements SharedPrefere
filter.addAction(AlarmClockReceiver.ALARM_DONE_ACTION);
registerReceiver(mAlarmClockReceiver, filter);
}
- /*
- if (mCMWeatherReceiver == null) {
+ if (mCMWeatherReceiver == null && coordinator != null && coordinator.supportsWeather()) {
mCMWeatherReceiver = new CMWeatherReceiver();
- registerReceiver(mCMWeatherReceiver, new IntentFilter("HOURLY_ALARM"));
+ registerReceiver(mCMWeatherReceiver, new IntentFilter("GB_UPDATE_WEATHER"));
}
- */
} else {
if (mPhoneCallReceiver != null) {
unregisterReceiver(mPhoneCallReceiver);
@@ -699,12 +697,10 @@ public class DeviceCommunicationService extends Service implements SharedPrefere
unregisterReceiver(mAlarmClockReceiver);
mAlarmClockReceiver = null;
}
- /*
if (mCMWeatherReceiver != null) {
unregisterReceiver(mCMWeatherReceiver);
mCMWeatherReceiver = null;
}
- */
}
}
diff --git a/app/src/main/java/ru/gelin/android/weather/notification/ParcelableWeather2.java b/app/src/main/java/ru/gelin/android/weather/notification/ParcelableWeather2.java
index 0d136d470..6707939f5 100644
--- a/app/src/main/java/ru/gelin/android/weather/notification/ParcelableWeather2.java
+++ b/app/src/main/java/ru/gelin/android/weather/notification/ParcelableWeather2.java
@@ -43,7 +43,7 @@ public class ParcelableWeather2 implements Parcelable {
if (version != 2) {
return;
}
- Bundle bundle = in.readBundle();
+ Bundle bundle = in.readBundle(getClass().getClassLoader());
weatherSpec.location = bundle.getString("weather_location");
long time = bundle.getLong("weather_time");
@@ -52,7 +52,7 @@ public class ParcelableWeather2 implements Parcelable {
bundle.getString("weather_forecast_url");
int conditions = bundle.getInt("weather_conditions");
if (conditions > 0) {
- Bundle conditionBundle = in.readBundle();
+ Bundle conditionBundle = in.readBundle(getClass().getClassLoader());
reconstructedOWMWeather = new JSONObject();
JSONArray weather = new JSONArray();
JSONObject condition = new JSONObject();
@@ -63,7 +63,9 @@ public class ParcelableWeather2 implements Parcelable {
weatherSpec.currentTemp = conditionBundle.getInt("weather_current_temp");
String[] currentConditionType = conditionBundle.getStringArray("weather_condition_types");
- weatherSpec.currentConditionCode = weatherConditionTypesToOpenWeatherMapIds(currentConditionType[0]);
+ if (currentConditionType != null) {
+ weatherSpec.currentConditionCode = weatherConditionTypesToOpenWeatherMapIds(currentConditionType[0]);
+ }
weatherSpec.todayMinTemp = conditionBundle.getInt("weather_low_temp");
weatherSpec.todayMaxTemp = conditionBundle.getInt("weather_high_temp");
try {
@@ -96,9 +98,12 @@ public class ParcelableWeather2 implements Parcelable {
condition = new JSONObject();
main = new JSONObject();
weather = new JSONArray();
- Bundle forecastBundle = in.readBundle();
+ Bundle forecastBundle = in.readBundle(getClass().getClassLoader());
String[] forecastConditionType = forecastBundle.getStringArray("weather_condition_types");
- int forecastConditionCode = weatherConditionTypesToOpenWeatherMapIds(forecastConditionType[0]);
+ int forecastConditionCode = 0;
+ if (forecastConditionType != null) {
+ forecastConditionCode = weatherConditionTypesToOpenWeatherMapIds(forecastConditionType[0]);
+ }
int forecastLowTemp = forecastBundle.getInt("weather_low_temp");
int forecastHighTemp = forecastBundle.getInt("weather_high_temp");
weatherSpec.forecasts.add(new WeatherSpec.Forecast(forecastLowTemp, forecastHighTemp, forecastConditionCode));
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index c9feac294..334939744 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -110,6 +110,7 @@
Hide number but display name
Hide name and number
+ Weather location
Blacklist Apps
Blacklist Calendars
diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml
index b0d543b75..55f111cb3 100644
--- a/app/src/main/res/xml/preferences.xml
+++ b/app/src/main/res/xml/preferences.xml
@@ -41,6 +41,9 @@
android:key="measurement_system"
android:summary="%s"
android:title="@string/pref_title_unit_system" />
+