Fetch weather from singleton instance

As a follow-up to #5239, avoid moving around a huge amount of data
through intents.
This commit is contained in:
José Rebelo
2025-08-14 18:25:12 +01:00
parent 3db92e7711
commit c1554762f7
44 changed files with 195 additions and 143 deletions
@@ -390,8 +390,7 @@ public class DebugActivity extends AbstractGBActivity {
Weather.setWeatherSpec(new ArrayList<>(Collections.singletonList(weatherSpec)));
}
final ArrayList<WeatherSpec> specs = new ArrayList<>(Weather.getWeatherSpecs());
GBApplication.deviceService().onSendWeather(specs);
GBApplication.deviceService().onSendWeather();
}
});
@@ -39,7 +39,6 @@ import nodomain.freeyourgadget.gadgetbridge.model.MusicStateSpec;
import nodomain.freeyourgadget.gadgetbridge.model.NavigationInfoSpec;
import nodomain.freeyourgadget.gadgetbridge.model.NotificationSpec;
import nodomain.freeyourgadget.gadgetbridge.model.Reminder;
import nodomain.freeyourgadget.gadgetbridge.model.WeatherSpec;
import nodomain.freeyourgadget.gadgetbridge.model.WorldClock;
/**
@@ -139,7 +138,7 @@ public interface EventHandler {
void onTestNewFunction();
void onSendWeather(ArrayList<WeatherSpec> weatherSpecs);
void onSendWeather();
void onSetFmFrequency(float frequency);
@@ -24,7 +24,6 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.UUID;
@@ -38,6 +37,7 @@ import nodomain.freeyourgadget.gadgetbridge.model.CannedMessagesSpec;
import nodomain.freeyourgadget.gadgetbridge.model.MusicSpec;
import nodomain.freeyourgadget.gadgetbridge.model.NotificationSpec;
import nodomain.freeyourgadget.gadgetbridge.model.WeatherSpec;
import nodomain.freeyourgadget.gadgetbridge.model.weather.Weather;
import nodomain.freeyourgadget.gadgetbridge.service.btle.AbstractBTLESingleDeviceSupport;
import nodomain.freeyourgadget.gadgetbridge.service.btle.GattService;
import nodomain.freeyourgadget.gadgetbridge.service.btle.TransactionBuilder;
@@ -252,8 +252,12 @@ public class SMAQ2OSSSupport extends AbstractBTLESingleDeviceSupport {
}
@Override
public void onSendWeather(ArrayList<WeatherSpec> weatherSpecs) {
WeatherSpec weatherSpec = weatherSpecs.get(0);
public void onSendWeather() {
final WeatherSpec weatherSpec = Weather.getWeatherSpec();
if (weatherSpec == null) {
LOG.warn("No weather found in singleton");
return;
}
try {
TransactionBuilder builder;
builder = performInitialized("Sending current weather");
@@ -180,7 +180,7 @@ public class CMWeatherReceiver extends BroadcastReceiver implements CMWeatherMan
}
ArrayList<WeatherSpec> weatherSpecs = new ArrayList<>(Collections.singletonList(weatherSpec));
Weather.setWeatherSpec(weatherSpecs);
GBApplication.deviceService().onSendWeather(weatherSpecs);
GBApplication.deviceService().onSendWeather();
} else {
LOG.info("request has returned null for WeatherInfo");
}
@@ -107,7 +107,7 @@ public class GenericWeatherReceiver extends BroadcastReceiver {
intent.replaceExtras((Bundle)null);
Weather.setWeatherSpec(weathers);
GBApplication.deviceService().onSendWeather(weathers);
GBApplication.deviceService().onSendWeather();
} catch (final Exception e) {
GB.toast("Gadgetbridge received broken or incompatible weather data", Toast.LENGTH_SHORT, GB.ERROR, e);
}
@@ -205,7 +205,7 @@ public class LineageOsWeatherReceiver extends BroadcastReceiver implements Linea
}
ArrayList<WeatherSpec> weatherSpecs = new ArrayList<>(Collections.singletonList(weatherSpec));
Weather.setWeatherSpec(weatherSpecs);
GBApplication.deviceService().onSendWeather(weatherSpecs);
GBApplication.deviceService().onSendWeather();
} else {
LOG.info("request has returned null for WeatherInfo");
}
@@ -140,7 +140,7 @@ public class OmniJawsObserver extends ContentObserver {
ArrayList<WeatherSpec> weatherSpecs = new ArrayList<>(Collections.singletonList(weatherSpec));
Weather.setWeatherSpec(weatherSpecs);
GBApplication.deviceService().onSendWeather(weatherSpecs);
GBApplication.deviceService().onSendWeather();
} finally {
c.close();
@@ -44,7 +44,7 @@ public class TinyWeatherForecastGermanyReceiver extends BroadcastReceiver {
ArrayList<WeatherSpec> weatherSpecs = new ArrayList<>(Collections.singletonList(weatherSpec));
weatherSpec.setTimestamp((int) (System.currentTimeMillis() / 1000));
Weather.setWeatherSpec(weatherSpecs);
GBApplication.deviceService().onSendWeather(weatherSpecs);
GBApplication.deviceService().onSendWeather();
}
} catch (Exception e) {
GB.toast("Gadgetbridge received broken or incompatible weather data", Toast.LENGTH_SHORT, GB.ERROR, e);
@@ -47,7 +47,6 @@ import nodomain.freeyourgadget.gadgetbridge.model.MusicStateSpec;
import nodomain.freeyourgadget.gadgetbridge.model.NavigationInfoSpec;
import nodomain.freeyourgadget.gadgetbridge.model.NotificationSpec;
import nodomain.freeyourgadget.gadgetbridge.model.Reminder;
import nodomain.freeyourgadget.gadgetbridge.model.WeatherSpec;
import nodomain.freeyourgadget.gadgetbridge.model.WorldClock;
import nodomain.freeyourgadget.gadgetbridge.service.DeviceCommunicationService;
import nodomain.freeyourgadget.gadgetbridge.util.RtlUtils;
@@ -495,9 +494,8 @@ public class GBDeviceService implements DeviceService {
}
@Override
public void onSendWeather(ArrayList<WeatherSpec> weatherSpecs) {
Intent intent = createIntent().setAction(ACTION_SEND_WEATHER)
.putExtra(EXTRA_WEATHER, weatherSpecs);
public void onSendWeather() {
Intent intent = createIntent().setAction(ACTION_SEND_WEATHER);
invokeService(intent);
}
@@ -144,7 +144,6 @@ public interface DeviceService extends EventHandler {
String EXTRA_CONNECT_FIRST_TIME = "connect_first_time";
String EXTRA_BOOLEAN_ENABLE = "enable_realtime_steps";
String EXTRA_INTERVAL_SECONDS = "interval_seconds";
String EXTRA_WEATHER = "weather";
String EXTRA_RECORDED_DATA_TYPES = "data_types";
String EXTRA_FM_FREQUENCY = "fm_frequency";
String EXTRA_LED_COLOR = "led_color";
@@ -49,9 +49,9 @@ import nodomain.freeyourgadget.gadgetbridge.model.MusicSpec;
import nodomain.freeyourgadget.gadgetbridge.model.MusicStateSpec;
import nodomain.freeyourgadget.gadgetbridge.model.NotificationSpec;
import nodomain.freeyourgadget.gadgetbridge.model.Reminder;
import nodomain.freeyourgadget.gadgetbridge.model.WeatherSpec;
import nodomain.freeyourgadget.gadgetbridge.model.WorldClock;
import nodomain.freeyourgadget.gadgetbridge.model.NavigationInfoSpec;
import nodomain.freeyourgadget.gadgetbridge.model.weather.Weather;
import nodomain.freeyourgadget.gadgetbridge.util.preferences.DevicePrefs;
// TODO: support option for a single reminder notification when notifications could not be delivered?
@@ -566,13 +566,11 @@ public abstract class AbstractDeviceSupport implements DeviceSupport {
/**
* If the device can receive weather information, this method can be
* overridden and implemented by the device support class. It's guaranteed
* that there is always at least one weatherSpec, with the first being the
* primary weather (not necessarily current location).
* @param weatherSpecs weather information
* overridden and implemented by the device support class. Support classes
* should use {@link Weather#getWeatherSpecs()} to obtain the list of WeatherSpecs.
*/
@Override
public void onSendWeather(ArrayList<WeatherSpec> weatherSpecs) {
public void onSendWeather() {
}
@@ -104,7 +104,6 @@ import nodomain.freeyourgadget.gadgetbridge.model.NavigationInfoSpec;
import nodomain.freeyourgadget.gadgetbridge.model.NotificationSpec;
import nodomain.freeyourgadget.gadgetbridge.model.NotificationType;
import nodomain.freeyourgadget.gadgetbridge.model.Reminder;
import nodomain.freeyourgadget.gadgetbridge.model.WeatherSpec;
import nodomain.freeyourgadget.gadgetbridge.model.WorldClock;
import nodomain.freeyourgadget.gadgetbridge.service.btle.BLEScanService;
import nodomain.freeyourgadget.gadgetbridge.service.receivers.AutoConnectIntervalReceiver;
@@ -1162,10 +1161,7 @@ public class DeviceCommunicationService extends Service implements SharedPrefere
break;
}
case ACTION_SEND_WEATHER: {
ArrayList<WeatherSpec> weatherSpecs = (ArrayList<WeatherSpec>) intentCopy.getSerializableExtra(EXTRA_WEATHER);
if (weatherSpecs != null && !weatherSpecs.isEmpty()) {
deviceSupport.onSendWeather(weatherSpecs);
}
deviceSupport.onSendWeather();
break;
}
case ACTION_SET_LED_COLOR:
@@ -46,7 +46,6 @@ import nodomain.freeyourgadget.gadgetbridge.model.MusicStateSpec;
import nodomain.freeyourgadget.gadgetbridge.model.NavigationInfoSpec;
import nodomain.freeyourgadget.gadgetbridge.model.NotificationSpec;
import nodomain.freeyourgadget.gadgetbridge.model.Reminder;
import nodomain.freeyourgadget.gadgetbridge.model.WeatherSpec;
import nodomain.freeyourgadget.gadgetbridge.model.WorldClock;
/**
@@ -473,11 +472,11 @@ public class ServiceDeviceSupport implements DeviceSupport {
}
@Override
public void onSendWeather(ArrayList<WeatherSpec> weatherSpecs) {
if (checkBusy("send weather events")) {
public void onSendWeather() {
if (checkBusy("send weather")) {
return;
}
delegate.onSendWeather(weatherSpecs);
delegate.onSendWeather();
}
@Override
@@ -27,7 +27,6 @@ import org.slf4j.LoggerFactory;
import java.io.ByteArrayOutputStream;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.Objects;
@@ -47,6 +46,7 @@ import nodomain.freeyourgadget.gadgetbridge.model.MusicSpec;
import nodomain.freeyourgadget.gadgetbridge.model.MusicStateSpec;
import nodomain.freeyourgadget.gadgetbridge.model.NotificationSpec;
import nodomain.freeyourgadget.gadgetbridge.model.WeatherSpec;
import nodomain.freeyourgadget.gadgetbridge.model.weather.Weather;
import nodomain.freeyourgadget.gadgetbridge.service.btle.AbstractBTLESingleDeviceSupport;
import nodomain.freeyourgadget.gadgetbridge.service.btle.BLETypeConversions;
import nodomain.freeyourgadget.gadgetbridge.service.btle.GattService;
@@ -233,8 +233,12 @@ public class AsteroidOSDeviceSupport extends AbstractBTLESingleDeviceSupport {
}
@Override
public void onSendWeather(ArrayList<WeatherSpec> weatherSpecs) {
WeatherSpec weatherSpec = weatherSpecs.get(0);
public void onSendWeather() {
final WeatherSpec weatherSpec = Weather.getWeatherSpec();
if (weatherSpec == null) {
LOG.warn("No weather found in singleton");
return;
}
AsteroidOSWeather asteroidOSWeather = new AsteroidOSWeather(weatherSpec);
TransactionBuilder builder = createTransactionBuilder("send weather info");
// Send city name
@@ -1983,35 +1983,26 @@ public class BangleJSDeviceSupport extends AbstractBTLESingleDeviceSupport {
}
}
private void handleWeather(JSONObject json)
{
if (!json.has("v")) {
handleWeatherV1(Weather.getWeatherSpecs());
private void handleWeather(final JSONObject json) {
final WeatherSpec weatherSpec = Weather.getWeatherSpec();
if (weatherSpec == null) {
LOG.warn("No weather found in singleton");
return;
}
try {
int version = json.getInt("v");
boolean forecast = false;
if (json.has("f")) {
forecast = json.getBoolean("f");
}
if (version == 1) {
handleWeatherV1(Weather.getWeatherSpecs());
} else if (version == 2) {
handleWeatherV2(Weather.getWeatherSpecs(), forecast);
}
} catch (JSONException e) {
LOG.info("JSONException: " + e.getLocalizedMessage());
final int version = json.optInt("v", 1);
switch (version) {
case 1:
handleWeatherV1(weatherSpec);
break;
case 2:
final boolean forecast = json.optBoolean("f", false);
handleWeatherV2(weatherSpec, forecast);
break;
}
}
private void handleWeatherV1(List<WeatherSpec> weatherSpecs)
{
if (weatherSpecs.isEmpty()) {
return;
}
WeatherSpec weatherSpec = weatherSpecs.get(0);
private void handleWeatherV1(final WeatherSpec weatherSpec) {
try {
JSONObject o = new JSONObject();
o.put("t", "weather");
@@ -2036,13 +2027,7 @@ public class BangleJSDeviceSupport extends AbstractBTLESingleDeviceSupport {
}
}
private void handleWeatherV2(List<WeatherSpec> weatherSpecs, boolean includeForecast)
{
if (weatherSpecs.isEmpty()) {
return;
}
WeatherSpec weatherSpec = weatherSpecs.get(0);
private void handleWeatherV2(final WeatherSpec weatherSpec, final boolean includeForecast) {
try {
JSONObject o = new JSONObject();
o.put("t", "weather");
@@ -2182,8 +2167,13 @@ public class BangleJSDeviceSupport extends AbstractBTLESingleDeviceSupport {
}
@Override
public void onSendWeather(ArrayList<WeatherSpec> weatherSpecs) {
handleWeatherV1(weatherSpecs);
public void onSendWeather() {
final WeatherSpec weatherSpec = Weather.getWeatherSpec();
if (weatherSpec == null) {
LOG.warn("No weather found in singleton");
return;
}
handleWeatherV1(weatherSpec);
}
public Bitmap textToBitmap(String text) {
@@ -71,6 +71,7 @@ import nodomain.freeyourgadget.gadgetbridge.model.Contact;
import nodomain.freeyourgadget.gadgetbridge.model.MusicSpec;
import nodomain.freeyourgadget.gadgetbridge.model.MusicStateSpec;
import nodomain.freeyourgadget.gadgetbridge.model.NotificationSpec;
import nodomain.freeyourgadget.gadgetbridge.model.weather.Weather;
import nodomain.freeyourgadget.gadgetbridge.model.weather.WeatherMapper;
import nodomain.freeyourgadget.gadgetbridge.model.WeatherSpec;
import nodomain.freeyourgadget.gadgetbridge.service.btle.AbstractBTLESingleDeviceSupport;
@@ -801,8 +802,12 @@ public class CmfWatchProSupport extends AbstractBTLESingleDeviceSupport implemen
}
@Override
public void onSendWeather(final ArrayList<WeatherSpec> weatherSpecs) {
final WeatherSpec weatherSpec = weatherSpecs.get(0);
public void onSendWeather() {
WeatherSpec weatherSpec = Weather.getWeatherSpec();
if (weatherSpec == null) {
LOG.warn("No weather found in singleton");
return;
}
// TODO consider adjusting the condition code for clear/sunny so "clear" at night doesn't show a sunny icon (perhaps 23 decimal)?
// Each weather entry takes up 9 bytes
// There are 7 of those weather entries - 7*9 bytes
@@ -56,6 +56,7 @@ import nodomain.freeyourgadget.gadgetbridge.model.CallSpec;
import nodomain.freeyourgadget.gadgetbridge.model.DeviceService;
import nodomain.freeyourgadget.gadgetbridge.model.NotificationSpec;
import nodomain.freeyourgadget.gadgetbridge.model.WeatherSpec;
import nodomain.freeyourgadget.gadgetbridge.model.weather.Weather;
import nodomain.freeyourgadget.gadgetbridge.service.btle.BLETypeConversions;
import nodomain.freeyourgadget.gadgetbridge.service.serial.GBDeviceProtocol;
import nodomain.freeyourgadget.gadgetbridge.util.BitmapUtil;
@@ -312,7 +313,13 @@ public class PixooProtocol extends GBDeviceProtocol {
@Override
public byte[] encodeSendWeather(WeatherSpec weatherSpec) {
public byte[] encodeSendWeather() {
final WeatherSpec weatherSpec = Weather.getWeatherSpec();
if (weatherSpec == null) {
LOG.warn("No weather found in singleton");
return null;
}
byte pixooWeatherCode = 0;
if (weatherSpec.getCurrentConditionCode() >= 200 && weatherSpec.getCurrentConditionCode() <= 299) {
pixooWeatherCode = 5;
@@ -18,7 +18,6 @@ import androidx.core.content.ContextCompat;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.TimeZone;
import java.util.concurrent.Callable;
@@ -448,9 +447,7 @@ public class G1DeviceSupport extends AbstractBTLEMultiDeviceSupport {
}
@Override
public void onSendWeather(ArrayList<WeatherSpec> weatherSpecs) {
// onSetTimeAndWeather() fetches the weather directly from the global state, so no need to
// pass in the weatherSpecs.
public void onSendWeather() {
onSetTimeOrWeather();
}
@@ -136,6 +136,7 @@ import nodomain.freeyourgadget.gadgetbridge.model.Alarm;
import nodomain.freeyourgadget.gadgetbridge.model.CallSpec;
import nodomain.freeyourgadget.gadgetbridge.model.DeviceService;
import nodomain.freeyourgadget.gadgetbridge.model.NotificationSpec;
import nodomain.freeyourgadget.gadgetbridge.model.weather.Weather;
import nodomain.freeyourgadget.gadgetbridge.model.weather.WeatherMapper;
import nodomain.freeyourgadget.gadgetbridge.model.WeatherSpec;
import nodomain.freeyourgadget.gadgetbridge.service.btle.AbstractBTLESingleDeviceSupport;
@@ -543,8 +544,12 @@ public class FitProDeviceSupport extends AbstractBTLESingleDeviceSupport {
}
@Override
public void onSendWeather(ArrayList<WeatherSpec> weatherSpecs) {
WeatherSpec weatherSpec = weatherSpecs.get(0);
public void onSendWeather() {
final WeatherSpec weatherSpec = Weather.getWeatherSpec();
if (weatherSpec == null) {
LOG.warn("No weather found in singleton");
return;
}
LOG.debug("FitPro send weather");
short todayMax = (short) (weatherSpec.getTodayMaxTemp() - 273);
short todayMin = (short) (weatherSpec.getTodayMinTemp() - 273);
@@ -551,8 +551,13 @@ public class GarminSupport extends AbstractBTLESingleDeviceSupport implements IC
}
@Override
public void onSendWeather(final ArrayList<WeatherSpec> weatherSpecs) { //todo: find the closest one relative to the requested lat/long
sendWeatherConditions(weatherSpecs.get(0));
public void onSendWeather() { //todo: find the closest one relative to the requested lat/long
WeatherSpec weatherSpec = Weather.getWeatherSpec();
if (weatherSpec == null) {
LOG.warn("No weather found in singleton");
return;
}
sendWeatherConditions(weatherSpec);
}
private void sendOutgoingMessage(final String taskName, final GFDIMessage message) {
@@ -44,7 +44,6 @@ import nodomain.freeyourgadget.gadgetbridge.model.Contact
import nodomain.freeyourgadget.gadgetbridge.model.MusicSpec
import nodomain.freeyourgadget.gadgetbridge.model.MusicStateSpec
import nodomain.freeyourgadget.gadgetbridge.model.NotificationSpec
import nodomain.freeyourgadget.gadgetbridge.model.WeatherSpec
import nodomain.freeyourgadget.gadgetbridge.service.btle.AbstractBTLESingleDeviceSupport
import nodomain.freeyourgadget.gadgetbridge.service.btle.TransactionBuilder
import nodomain.freeyourgadget.gadgetbridge.service.devices.sony.wena3.protocol.packets.notification.defines.VibrationKind
@@ -866,7 +865,7 @@ class GloryFitSupport() : AbstractBTLESingleDeviceSupport(LOG) {
builder.queue()
}
override fun onSendWeather(weatherSpecs: ArrayList<WeatherSpec?>?) {
override fun onSendWeather() {
// TODO onSendWeather
}
@@ -53,6 +53,7 @@ import nodomain.freeyourgadget.gadgetbridge.model.DeviceType;
import nodomain.freeyourgadget.gadgetbridge.model.GenericItem;
import nodomain.freeyourgadget.gadgetbridge.model.NotificationSpec;
import nodomain.freeyourgadget.gadgetbridge.model.WeatherSpec;
import nodomain.freeyourgadget.gadgetbridge.model.weather.Weather;
import nodomain.freeyourgadget.gadgetbridge.service.btle.AbstractBTLESingleDeviceSupport;
import nodomain.freeyourgadget.gadgetbridge.service.btle.TransactionBuilder;
import nodomain.freeyourgadget.gadgetbridge.service.btle.profiles.deviceinfo.DeviceInfo;
@@ -599,8 +600,12 @@ public class HPlusSupport extends AbstractBTLESingleDeviceSupport {
}
@Override
public void onSendWeather(ArrayList<WeatherSpec> weatherSpecs) {
WeatherSpec weatherSpec = weatherSpecs.get(0);
public void onSendWeather() {
WeatherSpec weatherSpec = Weather.getWeatherSpec();
if (weatherSpec == null) {
LOG.warn("No weather found in singleton");
return;
}
try {
TransactionBuilder builder = performInitialized("sendWeather");
@@ -120,6 +120,7 @@ import nodomain.freeyourgadget.gadgetbridge.model.ActivityUser;
import nodomain.freeyourgadget.gadgetbridge.model.Alarm;
import nodomain.freeyourgadget.gadgetbridge.model.SleepState;
import nodomain.freeyourgadget.gadgetbridge.model.WearingState;
import nodomain.freeyourgadget.gadgetbridge.model.weather.Weather;
import nodomain.freeyourgadget.gadgetbridge.service.btle.AbstractBTLESingleDeviceSupport;
import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.zeppos.services.ZeppOsCannedMessagesService;
import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.zeppos.services.ZeppOsWorldClocksService;
@@ -2848,7 +2849,7 @@ public abstract class HuamiSupport extends AbstractBTLESingleDeviceSupport
}
@Override
public void onSendWeather(ArrayList<WeatherSpec> weatherSpecs) {
public void onSendWeather() {
final DeviceCoordinator coordinator = gbDevice.getDeviceCoordinator();
if (!coordinator.supportsWeather(getDevice())) {
return;
@@ -2865,7 +2866,11 @@ public abstract class HuamiSupport extends AbstractBTLESingleDeviceSupport
supportsConditionString = false;
}
final WeatherSpec weatherSpec = weatherSpecs.get(0);
WeatherSpec weatherSpec = Weather.getWeatherSpec();
if (weatherSpec == null) {
LOG.warn("No weather found in singleton");
return;
}
MiBandConst.DistanceUnit unit = HuamiCoordinator.getDistanceUnit();
int tz_offset_hours = SimpleTimeZone.getDefault().getOffset(weatherSpec.getTimestamp() * 1000L) / (1000 * 60 * 60);
@@ -52,7 +52,6 @@ import nodomain.freeyourgadget.gadgetbridge.model.MusicSpec;
import nodomain.freeyourgadget.gadgetbridge.model.MusicStateSpec;
import nodomain.freeyourgadget.gadgetbridge.model.NotificationSpec;
import nodomain.freeyourgadget.gadgetbridge.model.Reminder;
import nodomain.freeyourgadget.gadgetbridge.model.WeatherSpec;
import nodomain.freeyourgadget.gadgetbridge.model.WorldClock;
import nodomain.freeyourgadget.gadgetbridge.service.btbr.AbstractBTBRDeviceSupport;
import nodomain.freeyourgadget.gadgetbridge.service.btbr.TransactionBuilder;
@@ -597,8 +596,8 @@ public class ZeppOsBtbrSupport extends AbstractBTBRDeviceSupport implements Zepp
}
@Override
public void onSendWeather(final ArrayList<WeatherSpec> weatherSpecs) {
zeppOsSupport.onSendWeather(weatherSpecs);
public void onSendWeather() {
zeppOsSupport.onSendWeather();
}
@Override
@@ -46,7 +46,6 @@ import nodomain.freeyourgadget.gadgetbridge.model.MusicSpec;
import nodomain.freeyourgadget.gadgetbridge.model.MusicStateSpec;
import nodomain.freeyourgadget.gadgetbridge.model.NotificationSpec;
import nodomain.freeyourgadget.gadgetbridge.model.Reminder;
import nodomain.freeyourgadget.gadgetbridge.model.WeatherSpec;
import nodomain.freeyourgadget.gadgetbridge.model.WorldClock;
import nodomain.freeyourgadget.gadgetbridge.service.btle.AbstractBTLESingleDeviceSupport;
import nodomain.freeyourgadget.gadgetbridge.service.btle.GattCharacteristic;
@@ -344,8 +343,8 @@ public class ZeppOsBtleSupport extends AbstractBTLESingleDeviceSupport implement
}
@Override
public void onSendWeather(final ArrayList<WeatherSpec> weatherSpecs) {
zeppOsSupport.onSendWeather(weatherSpecs);
public void onSendWeather() {
zeppOsSupport.onSendWeather();
}
@Override
@@ -87,7 +87,6 @@ import nodomain.freeyourgadget.gadgetbridge.model.MusicSpec;
import nodomain.freeyourgadget.gadgetbridge.model.MusicStateSpec;
import nodomain.freeyourgadget.gadgetbridge.model.NotificationSpec;
import nodomain.freeyourgadget.gadgetbridge.model.Reminder;
import nodomain.freeyourgadget.gadgetbridge.model.WeatherSpec;
import nodomain.freeyourgadget.gadgetbridge.service.btle.BLETypeConversions;
import nodomain.freeyourgadget.gadgetbridge.service.btle.GattCharacteristic;
import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.Huami2021ChunkedDecoder;
@@ -97,7 +96,6 @@ import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.HuamiDevicePre
import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.HuamiFetcher;
import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.zeppos.operations.ZeppOsAgpsUpdateOperation;
import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.zeppos.operations.ZeppOsFirmwareUpdateOperation;
import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.zeppos.operations.ZeppOsGpxRouteFile;
import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.zeppos.operations.ZeppOsGpxRouteUploadOperation;
import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.zeppos.operations.ZeppOsMusicUploadOperation;
import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.zeppos.services.ZeppOsActivityFetchService;
@@ -667,8 +665,8 @@ public class ZeppOsSupport extends AbstractDeviceSupport
}
@Override
public void onSendWeather(final ArrayList<WeatherSpec> weatherSpecs) {
weatherService.onSendWeather(weatherSpecs);
public void onSendWeather() {
weatherService.onSendWeather();
}
@Override
@@ -21,9 +21,9 @@ import org.slf4j.LoggerFactory;
import java.io.ByteArrayOutputStream;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import nodomain.freeyourgadget.gadgetbridge.model.WeatherSpec;
import nodomain.freeyourgadget.gadgetbridge.model.weather.Weather;
import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.zeppos.AbstractZeppOsService;
import nodomain.freeyourgadget.gadgetbridge.service.devices.huami.zeppos.ZeppOsSupport;
@@ -56,8 +56,12 @@ public class ZeppOsWeatherService extends AbstractZeppOsService {
}
}
public void onSendWeather(final ArrayList<WeatherSpec> weatherSpecs) {
final WeatherSpec weatherSpec = weatherSpecs.get(0);
public void onSendWeather() {
final WeatherSpec weatherSpec = Weather.getWeatherSpec();
if (weatherSpec == null) {
LOG.warn("No weather found in singleton");
return;
}
// Weather is not sent directly to the bands, they send HTTP requests for each location.
// When we have a weather update, set the default location to that location on the band.
@@ -39,7 +39,6 @@ import nodomain.freeyourgadget.gadgetbridge.model.Contact;
import nodomain.freeyourgadget.gadgetbridge.model.MusicSpec;
import nodomain.freeyourgadget.gadgetbridge.model.MusicStateSpec;
import nodomain.freeyourgadget.gadgetbridge.model.NotificationSpec;
import nodomain.freeyourgadget.gadgetbridge.model.WeatherSpec;
import nodomain.freeyourgadget.gadgetbridge.service.btbr.AbstractBTBRDeviceSupport;
import nodomain.freeyourgadget.gadgetbridge.service.btbr.TransactionBuilder;
@@ -147,8 +146,8 @@ public class HuaweiBRSupport extends AbstractBTBRDeviceSupport {
}
@Override
public void onSendWeather(ArrayList<WeatherSpec> weatherSpecs) {
supportProvider.onSendWeather(weatherSpecs);
public void onSendWeather() {
supportProvider.onSendWeather();
}
@Override
@@ -43,7 +43,6 @@ import nodomain.freeyourgadget.gadgetbridge.model.Contact;
import nodomain.freeyourgadget.gadgetbridge.model.MusicSpec;
import nodomain.freeyourgadget.gadgetbridge.model.MusicStateSpec;
import nodomain.freeyourgadget.gadgetbridge.model.NotificationSpec;
import nodomain.freeyourgadget.gadgetbridge.model.WeatherSpec;
import nodomain.freeyourgadget.gadgetbridge.service.btle.AbstractBTLESingleDeviceSupport;
import nodomain.freeyourgadget.gadgetbridge.service.btle.GattService;
import nodomain.freeyourgadget.gadgetbridge.service.btle.TransactionBuilder;
@@ -153,8 +152,8 @@ public class HuaweiLESupport extends AbstractBTLESingleDeviceSupport {
}
@Override
public void onSendWeather(ArrayList<WeatherSpec> weatherSpecs) {
supportProvider.onSendWeather(weatherSpecs);
public void onSendWeather() {
supportProvider.onSendWeather();
}
@Override
@@ -2543,8 +2543,13 @@ public class HuaweiSupportProvider {
return huaweiWeatherManager.openWeatherMapConditionCodeToHuaweiIcon(conditionCode);
}
public void onSendWeather(ArrayList<WeatherSpec> weatherSpecs) {
huaweiWeatherManager.sendWeather(weatherSpecs.get(0));
public void onSendWeather() {
WeatherSpec weatherSpec = nodomain.freeyourgadget.gadgetbridge.model.weather.Weather.getWeatherSpec();
if (weatherSpec == null) {
LOG.warn("No weather found in singleton");
return;
}
huaweiWeatherManager.sendWeather(weatherSpec);
}
public void onSetGpsLocation(Location location) {
@@ -22,7 +22,6 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import nodomain.freeyourgadget.gadgetbridge.devices.huawei.HuaweiPacket;
@@ -277,8 +276,8 @@ public class HuaweiWeatherManager {
public void handleAsyncMessage(HuaweiPacket response) {
if (response.getTlv().getInteger(0x7f, -1) == 0x000186AA) {
// Send weather
final ArrayList<WeatherSpec> specs = new ArrayList<>(nodomain.freeyourgadget.gadgetbridge.model.weather.Weather.getWeatherSpecs());
if (specs.isEmpty()) {
final WeatherSpec weatherSpec = nodomain.freeyourgadget.gadgetbridge.model.weather.Weather.getWeatherSpec();
if (weatherSpec == null) {
LOG.debug("Weather specs empty, returning that weather is disabled.");
try {
new SendWeatherErrorRequest(supportProvider, Weather.ErrorCode.WEATHER_DISABLED).doPerform();
@@ -287,7 +286,7 @@ public class HuaweiWeatherManager {
}
return;
}
this.sendWeather(specs.get(0));
this.sendWeather(weatherSpec);
return;
}
@@ -73,6 +73,7 @@ import nodomain.freeyourgadget.gadgetbridge.model.BatteryState;
import nodomain.freeyourgadget.gadgetbridge.model.CallSpec;
import nodomain.freeyourgadget.gadgetbridge.model.NotificationSpec;
import nodomain.freeyourgadget.gadgetbridge.model.WeatherSpec;
import nodomain.freeyourgadget.gadgetbridge.model.weather.Weather;
import nodomain.freeyourgadget.gadgetbridge.service.btle.AbstractBTLESingleDeviceSupport;
import nodomain.freeyourgadget.gadgetbridge.service.btle.BLETypeConversions;
import nodomain.freeyourgadget.gadgetbridge.service.btle.GattService;
@@ -1213,8 +1214,12 @@ public class WatchXPlusDeviceSupport extends AbstractBTLESingleDeviceSupport {
}
@Override
public void onSendWeather(ArrayList<WeatherSpec> weatherSpecs) {
WeatherSpec weatherSpec = weatherSpecs.get(0);
public void onSendWeather() {
WeatherSpec weatherSpec = Weather.getWeatherSpec();
if (weatherSpec == null) {
LOG.warn("No weather found in singleton");
return;
}
try {
TransactionBuilder builder = performInitialized("setWeather");
int currentTemp;
@@ -447,13 +447,12 @@ public class MoyoungDeviceSupport extends AbstractBTLESingleDeviceSupport {
if (packetType == MoyoungConstants.CMD_NOTIFY_WEATHER_CHANGE) {
LOG.info("Will transmit cached weather (if any) since the watch asks for it");
if (Weather.getWeatherSpec() != null) {
final ArrayList<WeatherSpec> specs = new ArrayList<>(Weather.getWeatherSpecs());
GBApplication.deviceService().onSendWeather(specs);
onSendWeather();
}
return true;
}
for (MoyoungSetting setting : queriedSettings) {
for (MoyoungSetting<?> setting : queriedSettings) {
if (setting.cmdQuery == packetType) {
Object value = setting.decode(payload);
onReadConfigurationDone(setting, value, payload);
@@ -1982,9 +1981,13 @@ public class MoyoungDeviceSupport extends AbstractBTLESingleDeviceSupport {
}
@Override
public void onSendWeather(ArrayList<WeatherSpec> weatherSpecs) {
public void onSendWeather() {
try {
WeatherSpec weatherSpec = weatherSpecs.get(0);
WeatherSpec weatherSpec = Weather.getWeatherSpec();
if (weatherSpec == null) {
LOG.warn("No weather found in singleton");
return;
}
TransactionBuilder builder = performInitialized("onSendWeather");
// Weather today packet
@@ -427,7 +427,7 @@ public class PebbleProtocol extends GBDeviceProtocol {
mAppMessageHandlers.put(UUID_WEATHER, new AppMessageHandler(UUID_WEATHER, PebbleProtocol.this){
@Override
public GBDeviceEvent[] onAppStart() {
return new GBDeviceEvent[] {new GBDeviceEventSendBytes(encodeSendWeather(Weather.getWeatherSpec()))};
return new GBDeviceEvent[] {new GBDeviceEventSendBytes(encodeSendWeather())};
}
});
if (!((PebbleCoordinator) device.getDeviceCoordinator()).isBackgroundJsEnabled(device)) {
@@ -1121,7 +1121,13 @@ public class PebbleProtocol extends GBDeviceProtocol {
@Override
public byte[] encodeSendWeather(WeatherSpec weatherSpec) {
public byte[] encodeSendWeather() {
final WeatherSpec weatherSpec = Weather.getWeatherSpec();
if (weatherSpec == null) {
LOG.warn("No weather found in singleton");
return null;
}
byte[] forecastProtocol = null;
byte[] watchfaceProtocol = null;
int length = 0;
@@ -46,7 +46,6 @@ import nodomain.freeyourgadget.gadgetbridge.model.CallSpec;
import nodomain.freeyourgadget.gadgetbridge.model.MusicSpec;
import nodomain.freeyourgadget.gadgetbridge.model.MusicStateSpec;
import nodomain.freeyourgadget.gadgetbridge.model.NotificationSpec;
import nodomain.freeyourgadget.gadgetbridge.model.WeatherSpec;
import nodomain.freeyourgadget.gadgetbridge.service.serial.AbstractSerialDeviceSupport;
import nodomain.freeyourgadget.gadgetbridge.service.serial.GBDeviceIoThread;
import nodomain.freeyourgadget.gadgetbridge.service.serial.GBDeviceProtocol;
@@ -264,9 +263,9 @@ public class PebbleSupport extends AbstractSerialDeviceSupport {
}
@Override
public void onSendWeather(ArrayList<WeatherSpec> weatherSpecs) {
public void onSendWeather() {
if (reconnect()) {
super.onSendWeather(weatherSpecs);
super.onSendWeather();
}
}
}
@@ -90,6 +90,7 @@ import nodomain.freeyourgadget.gadgetbridge.model.NotificationSpec;
import nodomain.freeyourgadget.gadgetbridge.model.NotificationType;
import nodomain.freeyourgadget.gadgetbridge.model.WeatherSpec;
import nodomain.freeyourgadget.gadgetbridge.model.WorldClock;
import nodomain.freeyourgadget.gadgetbridge.model.weather.Weather;
import nodomain.freeyourgadget.gadgetbridge.service.btle.AbstractBTLESingleDeviceSupport;
import nodomain.freeyourgadget.gadgetbridge.service.btle.BLETypeConversions;
import nodomain.freeyourgadget.gadgetbridge.service.btle.GattCharacteristic;
@@ -1015,8 +1016,12 @@ public class PineTimeJFSupport extends AbstractBTLESingleDeviceSupport implement
}
@Override
public void onSendWeather(ArrayList<WeatherSpec> weatherSpecs) {
WeatherSpec weatherSpec = weatherSpecs.get(0);
public void onSendWeather() {
WeatherSpec weatherSpec = Weather.getWeatherSpec();
if (weatherSpec == null) {
LOG.warn("No weather found in singleton");
return;
}
if (this.firmwareVersionMajor < 1 || (this.firmwareVersionMajor == 1 && this.firmwareVersionMinor <= 7)) {
// Not supported
@@ -68,6 +68,7 @@ import nodomain.freeyourgadget.gadgetbridge.model.NavigationInfoSpec;
import nodomain.freeyourgadget.gadgetbridge.model.NotificationSpec;
import nodomain.freeyourgadget.gadgetbridge.model.RecordedDataTypes;
import nodomain.freeyourgadget.gadgetbridge.model.WeatherSpec;
import nodomain.freeyourgadget.gadgetbridge.model.weather.Weather;
import nodomain.freeyourgadget.gadgetbridge.service.btle.BLETypeConversions;
import nodomain.freeyourgadget.gadgetbridge.service.btle.GattService;
import nodomain.freeyourgadget.gadgetbridge.service.btle.TransactionBuilder;
@@ -737,8 +738,12 @@ public class QHybridSupport extends QHybridBaseSupport {
}
@Override
public void onSendWeather(ArrayList<WeatherSpec> weatherSpecs) {
watchAdapter.onSendWeather(weatherSpecs.get(0));
public void onSendWeather() {
final WeatherSpec weatherSpec = Weather.getWeatherSpec();
if (weatherSpec == null) {
return;
}
watchAdapter.onSendWeather(weatherSpec);
}
@Override
@@ -599,8 +599,12 @@ public class SonyWena3DeviceSupport extends AbstractBTLESingleDeviceSupport {
}
@Override
public void onSendWeather(ArrayList<WeatherSpec> weatherSpecs) {
WeatherSpec weatherSpec = weatherSpecs.get(0);
public void onSendWeather() {
WeatherSpec weatherSpec = nodomain.freeyourgadget.gadgetbridge.model.weather.Weather.getWeatherSpec();
if (weatherSpec == null) {
LOG.warn("No weather found in singleton");
return;
}
if(weatherSpec.getForecasts().size() < 4) return;
ArrayList<WeatherDay> days = new ArrayList<>();
@@ -48,6 +48,7 @@ import nodomain.freeyourgadget.gadgetbridge.model.MusicSpec;
import nodomain.freeyourgadget.gadgetbridge.model.MusicStateSpec;
import nodomain.freeyourgadget.gadgetbridge.model.NotificationSpec;
import nodomain.freeyourgadget.gadgetbridge.model.WeatherSpec;
import nodomain.freeyourgadget.gadgetbridge.model.weather.Weather;
import nodomain.freeyourgadget.gadgetbridge.service.btle.AbstractBTLESingleDeviceSupport;
import nodomain.freeyourgadget.gadgetbridge.service.btle.TransactionBuilder;
import nodomain.freeyourgadget.gadgetbridge.util.AlarmUtils;
@@ -375,8 +376,12 @@ public class WaspOSDeviceSupport extends AbstractBTLESingleDeviceSupport {
}
@Override
public void onSendWeather(ArrayList<WeatherSpec> weatherSpecs) {
WeatherSpec weatherSpec = weatherSpecs.get(0);
public void onSendWeather() {
WeatherSpec weatherSpec = Weather.getWeatherSpec();
if (weatherSpec == null) {
LOG.warn("No weather found in singleton");
return;
}
try {
JSONObject o = new JSONObject();
o.put("t", "weather");
@@ -58,7 +58,6 @@ import nodomain.freeyourgadget.gadgetbridge.model.MusicSpec;
import nodomain.freeyourgadget.gadgetbridge.model.MusicStateSpec;
import nodomain.freeyourgadget.gadgetbridge.model.NotificationSpec;
import nodomain.freeyourgadget.gadgetbridge.model.Reminder;
import nodomain.freeyourgadget.gadgetbridge.model.WeatherSpec;
import nodomain.freeyourgadget.gadgetbridge.model.WorldClock;
import nodomain.freeyourgadget.gadgetbridge.proto.xiaomi.XiaomiProto;
import nodomain.freeyourgadget.gadgetbridge.service.AbstractDeviceSupport;
@@ -393,8 +392,8 @@ public class XiaomiSupport extends AbstractDeviceSupport {
}
@Override
public void onSendWeather(final ArrayList<WeatherSpec> weatherSpecs) {
weatherService.onSendWeather(weatherSpecs);
public void onSendWeather() {
weatherService.onSendWeather();
}
@Override
@@ -20,6 +20,7 @@ import android.text.TextUtils;
import androidx.annotation.NonNull;
import org.jetbrains.annotations.NotNull;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -408,11 +409,12 @@ public class XiaomiWeatherService extends AbstractXiaomiService {
return getDevicePrefs().getBoolean(XiaomiPreferences.FEAT_MULTIPLE_WEATHER_LOCATIONS, false);
}
public void onSendWeather(@NonNull final List<WeatherSpec> weatherSpecList) {
public void onSendWeather() {
final List<@NotNull WeatherSpec> weatherSpecList = Weather.getWeatherSpecs();
if (supportsMultipleWeatherLocations()) {
sendWeatherSpecList(weatherSpecList);
} else {
if (!weatherSpecList.isEmpty() && weatherSpecList.get(0) != null) {
if (!weatherSpecList.isEmpty()) {
final WeatherSpec specToSend = weatherSpecList.get(0);
addWeatherLocationFromSpec(specToSend);
sendWeatherSpec(specToSend);
@@ -567,7 +569,7 @@ public class XiaomiWeatherService extends AbstractXiaomiService {
locationsInitialized = true;
// now that the feature flag has been updated, send cached weather
onSendWeather(Weather.getWeatherSpecs());
onSendWeather();
return;
}
@@ -56,6 +56,7 @@ import nodomain.freeyourgadget.gadgetbridge.model.ActivityUser;
import nodomain.freeyourgadget.gadgetbridge.model.Alarm;
import nodomain.freeyourgadget.gadgetbridge.model.BatteryState;
import nodomain.freeyourgadget.gadgetbridge.model.CalendarEventSpec;
import nodomain.freeyourgadget.gadgetbridge.model.weather.Weather;
import nodomain.freeyourgadget.gadgetbridge.service.btle.AbstractBTLESingleDeviceSupport;
import nodomain.freeyourgadget.gadgetbridge.util.calendar.CalendarEvent;
import nodomain.freeyourgadget.gadgetbridge.model.CallSpec;
@@ -592,8 +593,12 @@ public class ZeTimeDeviceSupport extends AbstractBTLESingleDeviceSupport {
}
@Override
public void onSendWeather(ArrayList<WeatherSpec> weatherSpecs) {
WeatherSpec weatherSpec = weatherSpecs.get(0);
public void onSendWeather() {
WeatherSpec weatherSpec = Weather.getWeatherSpec();
if (weatherSpec == null) {
LOG.warn("No weather found in singleton");
return;
}
byte[] weather = new byte[weatherSpec.getLocation().getBytes(StandardCharsets.UTF_8).length + 26]; // 26 bytes for weatherdata and overhead
weather[0] = ZeTimeConstants.CMD_PREAMBLE;
weather[1] = ZeTimeConstants.CMD_PUSH_WEATHER_DATA;
@@ -36,7 +36,6 @@ import nodomain.freeyourgadget.gadgetbridge.model.MusicSpec;
import nodomain.freeyourgadget.gadgetbridge.model.MusicStateSpec;
import nodomain.freeyourgadget.gadgetbridge.model.NotificationSpec;
import nodomain.freeyourgadget.gadgetbridge.model.Reminder;
import nodomain.freeyourgadget.gadgetbridge.model.WeatherSpec;
import nodomain.freeyourgadget.gadgetbridge.model.WorldClock;
import nodomain.freeyourgadget.gadgetbridge.service.AbstractDeviceSupport;
@@ -286,9 +285,8 @@ public abstract class AbstractSerialDeviceSupport extends AbstractDeviceSupport
}
@Override
public void onSendWeather(ArrayList<WeatherSpec> weatherSpecs) {
WeatherSpec weatherSpec = weatherSpecs.get(0);
byte[] bytes = gbDeviceProtocol.encodeSendWeather(weatherSpec);
public void onSendWeather() {
byte[] bytes = gbDeviceProtocol.encodeSendWeather();
sendToDevice(bytes);
}
@@ -178,7 +178,7 @@ public abstract class GBDeviceProtocol {
}
@Nullable
public byte[] encodeSendWeather(WeatherSpec weatherSpec) {
public byte[] encodeSendWeather() {
return null;
}