From f0ac296492c9ddb6426d3c0116a8e5b151c9d883 Mon Sep 17 00:00:00 2001 From: Andreas Shimokawa Date: Mon, 11 Dec 2017 19:09:37 +0100 Subject: [PATCH] Initial support for cyanogenmod/lineage weather provider TODO: - also reconstruct json for Pebble background js fake replies - find a better location for settings - interatively display candidates when looking up location - grey out setting on non-cm/los devices --- app/build.gradle | 1 + app/src/main/AndroidManifest.xml | 3 + .../activities/SettingsActivity.java | 17 ++ .../devices/DeviceCoordinator.java | 7 +- .../devices/UnknownDeviceCoordinator.java | 5 + .../devices/hplus/HPlusCoordinator.java | 5 + .../amazfitbip/AmazfitBipCoordinator.java | 5 + .../amazfitcor/AmazfitCorCoordinator.java | 5 + .../huami/miband2/MiBand2Coordinator.java | 5 + .../huami/miband2/MiBand2HRXCoordinator.java | 5 + .../devices/jyou/TeclastH30Coordinator.java | 5 + .../devices/liveview/LiveviewCoordinator.java | 7 +- .../devices/miband/MiBandCoordinator.java | 5 + .../devices/no1f1/No1F1Coordinator.java | 5 + .../devices/pebble/PebbleCoordinator.java | 5 + .../vibratissimo/VibratissimoCoordinator.java | 5 + .../externalevents/CMWeatherReceiver.java | 194 ++++++++++++++++++ .../service/DeviceCommunicationService.java | 12 +- .../notification/ParcelableWeather2.java | 15 +- app/src/main/res/values/strings.xml | 1 + app/src/main/res/xml/preferences.xml | 3 + 21 files changed, 300 insertions(+), 15 deletions(-) create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/CMWeatherReceiver.java 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" /> +