diff --git a/bundles/org.openhab.binding.gpstracker/src/main/java/org/openhab/binding/gpstracker/internal/GPSTrackerBindingConstants.java b/bundles/org.openhab.binding.gpstracker/src/main/java/org/openhab/binding/gpstracker/internal/GPSTrackerBindingConstants.java index dccc80b91..a9579f082 100644 --- a/bundles/org.openhab.binding.gpstracker/src/main/java/org/openhab/binding/gpstracker/internal/GPSTrackerBindingConstants.java +++ b/bundles/org.openhab.binding.gpstracker/src/main/java/org/openhab/binding/gpstracker/internal/GPSTrackerBindingConstants.java @@ -16,6 +16,7 @@ import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; +import org.eclipse.jdt.annotation.NonNullByDefault; import org.openhab.core.thing.ThingTypeUID; import org.openhab.core.thing.type.ChannelTypeUID; @@ -24,6 +25,7 @@ import org.openhab.core.thing.type.ChannelTypeUID; * * @author Gabor Bicskei - Initial contribution */ +@NonNullByDefault public abstract class GPSTrackerBindingConstants { public static final String BINDING_ID = "gpstracker"; static final String CONFIG_PID = "binding." + BINDING_ID; diff --git a/bundles/org.openhab.binding.gpstracker/src/main/java/org/openhab/binding/gpstracker/internal/config/ConfigHelper.java b/bundles/org.openhab.binding.gpstracker/src/main/java/org/openhab/binding/gpstracker/internal/config/ConfigHelper.java index 0f436e194..908680085 100644 --- a/bundles/org.openhab.binding.gpstracker/src/main/java/org/openhab/binding/gpstracker/internal/config/ConfigHelper.java +++ b/bundles/org.openhab.binding.gpstracker/src/main/java/org/openhab/binding/gpstracker/internal/config/ConfigHelper.java @@ -14,6 +14,8 @@ package org.openhab.binding.gpstracker.internal.config; import java.math.BigDecimal; +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.eclipse.jdt.annotation.Nullable; import org.openhab.core.config.core.Configuration; import org.openhab.core.library.types.PointType; @@ -22,6 +24,7 @@ import org.openhab.core.library.types.PointType; * * @author Gabor Bicskei - Initial contribution */ +@NonNullByDefault public class ConfigHelper { // configuration constants public static final String CONFIG_TRACKER_ID = "trackerId"; @@ -53,7 +56,7 @@ public class ConfigHelper { return (String) config.get(CONFIG_TRACKER_ID); } - public static PointType getRegionCenterLocation(Configuration config) { + public static @Nullable PointType getRegionCenterLocation(Configuration config) { String location = (String) config.get(CONFIG_REGION_CENTER_LOCATION); return location != null ? new PointType(location) : null; } diff --git a/bundles/org.openhab.binding.gpstracker/src/main/java/org/openhab/binding/gpstracker/internal/handler/TrackerHandler.java b/bundles/org.openhab.binding.gpstracker/src/main/java/org/openhab/binding/gpstracker/internal/handler/TrackerHandler.java index 0f12ab127..136dc4821 100644 --- a/bundles/org.openhab.binding.gpstracker/src/main/java/org/openhab/binding/gpstracker/internal/handler/TrackerHandler.java +++ b/bundles/org.openhab.binding.gpstracker/src/main/java/org/openhab/binding/gpstracker/internal/handler/TrackerHandler.java @@ -26,13 +26,13 @@ import java.util.stream.Collectors; import javax.measure.Unit; import javax.measure.quantity.Length; -import org.eclipse.jdt.annotation.NonNull; +import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.jdt.annotation.Nullable; import org.openhab.binding.gpstracker.internal.config.ConfigHelper; -import org.openhab.binding.gpstracker.internal.message.LocationMessage; import org.openhab.binding.gpstracker.internal.message.NotificationBroker; import org.openhab.binding.gpstracker.internal.message.NotificationHandler; -import org.openhab.binding.gpstracker.internal.message.TransitionMessage; +import org.openhab.binding.gpstracker.internal.message.dto.LocationMessage; +import org.openhab.binding.gpstracker.internal.message.dto.TransitionMessage; import org.openhab.core.config.core.Configuration; import org.openhab.core.i18n.UnitProvider; import org.openhab.core.library.types.PointType; @@ -60,6 +60,7 @@ import org.slf4j.LoggerFactory; * * @author Gabor Bicskei - Initial contribution */ +@NonNullByDefault public class TrackerHandler extends BaseThingHandler { /** * Trigger events @@ -105,17 +106,17 @@ public class TrackerHandler extends BaseThingHandler { /** * System location */ - private PointType sysLocation; + private @Nullable PointType sysLocation; /** * Unit provider */ - private UnitProvider unitProvider; + private @Nullable UnitProvider unitProvider; /** * Last message received from the tracker */ - private LocationMessage lastMessage; + private @Nullable LocationMessage lastMessage; /** * Constructor. @@ -127,7 +128,7 @@ public class TrackerHandler extends BaseThingHandler { * @param unitProvider Unit provider */ public TrackerHandler(Thing thing, NotificationBroker notificationBroker, Set regions, - PointType sysLocation, UnitProvider unitProvider) { + @Nullable PointType sysLocation, @Nullable UnitProvider unitProvider) { super(thing); this.notificationBroker = notificationBroker; @@ -174,15 +175,15 @@ public class TrackerHandler extends BaseThingHandler { ChannelUID systemDistanceChannelUID = new ChannelUID(thing.getUID(), CHANNEL_DISTANCE_SYSTEM_ID); Channel systemDistance = thing.getChannel(CHANNEL_DISTANCE_SYSTEM_ID); ChannelBuilder channelBuilder = null; + String sysLocationString = sysLocation == null ? "unknown" : sysLocation.toFullString(); if (systemDistance != null) { - if (!systemDistance.getConfiguration().get(CONFIG_REGION_CENTER_LOCATION) - .equals(sysLocation.toFullString())) { + if (!systemDistance.getConfiguration().get(CONFIG_REGION_CENTER_LOCATION).equals(sysLocationString)) { logger.trace("Existing distance channel for system. Changing system location config parameter: {}", - sysLocation.toFullString()); + sysLocationString); channelBuilder = callback.editChannel(thing, systemDistanceChannelUID); Configuration configToUpdate = systemDistance.getConfiguration(); - configToUpdate.put(CONFIG_REGION_CENTER_LOCATION, sysLocation.toFullString()); + configToUpdate.put(CONFIG_REGION_CENTER_LOCATION, sysLocationString); channelBuilder.withConfiguration(configToUpdate); } else { logger.trace("Existing distance channel for system. No change."); @@ -192,7 +193,7 @@ public class TrackerHandler extends BaseThingHandler { Configuration config = new Configuration(); config.put(ConfigHelper.CONFIG_REGION_NAME, CHANNEL_DISTANCE_SYSTEM_NAME); - config.put(CONFIG_REGION_CENTER_LOCATION, sysLocation.toFullString()); + config.put(CONFIG_REGION_CENTER_LOCATION, sysLocationString); config.put(ConfigHelper.CONFIG_REGION_RADIUS, CHANNEL_DISTANCE_SYSTEM_RADIUS); config.put(ConfigHelper.CONFIG_ACCURACY_THRESHOLD, 0); @@ -230,26 +231,27 @@ public class TrackerHandler extends BaseThingHandler { @Override public void handleCommand(ChannelUID channelUID, Command command) { - if (command instanceof RefreshType && lastMessage != null) { + LocationMessage lastMessageLocal = lastMessage; + if (command instanceof RefreshType && lastMessageLocal != null) { String channelId = channelUID.getId(); switch (channelId) { case CHANNEL_LAST_REPORT: - updateBaseChannels(lastMessage, CHANNEL_LAST_REPORT); + updateBaseChannels(lastMessageLocal, CHANNEL_LAST_REPORT); break; case CHANNEL_LAST_LOCATION: - updateBaseChannels(lastMessage, CHANNEL_LAST_LOCATION); + updateBaseChannels(lastMessageLocal, CHANNEL_LAST_LOCATION); break; case CHANNEL_BATTERY_LEVEL: - updateBaseChannels(lastMessage, CHANNEL_BATTERY_LEVEL); + updateBaseChannels(lastMessageLocal, CHANNEL_BATTERY_LEVEL); break; case CHANNEL_GPS_ACCURACY: - updateBaseChannels(lastMessage, CHANNEL_GPS_ACCURACY); + updateBaseChannels(lastMessageLocal, CHANNEL_GPS_ACCURACY); break; default: // distance channels @Nullable Channel channel = thing.getChannel(channelId); if (channel != null) { - updateDistanceChannelFromMessage(lastMessage, channel); + updateDistanceChannelFromMessage(lastMessageLocal, channel); } } } @@ -272,7 +274,7 @@ public class TrackerHandler extends BaseThingHandler { * @param event Occurred event * @param forced Force channel triggering in case the transition event is received from the mobile application. */ - private void triggerRegionChannel(@NonNull String regionName, @NonNull String event, boolean forced) { + private void triggerRegionChannel(String regionName, String event, boolean forced) { Boolean lastState = lastTriggeredStates.get(regionName); Boolean newState = EVENT_ENTER.equals(event); if (!newState.equals(lastState) || forced) { @@ -341,9 +343,10 @@ public class TrackerHandler extends BaseThingHandler { } private double convertToMeters(double valueToConvert) { - if (unitProvider != null) { + UnitProvider unitProviderLocal = unitProvider; + if (unitProviderLocal != null) { @Nullable - Unit unit = unitProvider.getUnit(Length.class); + Unit unit = unitProviderLocal.getUnit(Length.class); if (unit != null && !SIUnits.METRE.equals(unit)) { double value = ImperialUnits.YARD.getConverterTo(SIUnits.METRE).convert(valueToConvert); logger.trace("Value converted: {}yd->{}m", valueToConvert, value); diff --git a/bundles/org.openhab.binding.gpstracker/src/main/java/org/openhab/binding/gpstracker/internal/message/MessageUtil.java b/bundles/org.openhab.binding.gpstracker/src/main/java/org/openhab/binding/gpstracker/internal/message/MessageUtil.java index eaf849083..ad2d89425 100644 --- a/bundles/org.openhab.binding.gpstracker/src/main/java/org/openhab/binding/gpstracker/internal/message/MessageUtil.java +++ b/bundles/org.openhab.binding.gpstracker/src/main/java/org/openhab/binding/gpstracker/internal/message/MessageUtil.java @@ -15,6 +15,11 @@ package org.openhab.binding.gpstracker.internal.message; import java.util.HashMap; import java.util.Map; +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.eclipse.jdt.annotation.Nullable; +import org.openhab.binding.gpstracker.internal.message.dto.LocationMessage; +import org.openhab.binding.gpstracker.internal.message.dto.TransitionMessage; + import com.google.gson.Gson; /** @@ -22,6 +27,7 @@ import com.google.gson.Gson; * * @author Gabor Bicskei - Initial contribution */ +@NonNullByDefault public class MessageUtil { /** * Patterns to identify incoming JSON payload. @@ -48,7 +54,7 @@ public class MessageUtil { * @param json JSON string. * @return Parsed message POJO or null without pattern match */ - public LocationMessage fromJson(String json) { + public @Nullable LocationMessage fromJson(String json) { for (String pattern : PATTERNS) { Class c = MESSAGE_TYPES.get(pattern); if (c != null && json.matches(pattern)) { diff --git a/bundles/org.openhab.binding.gpstracker/src/main/java/org/openhab/binding/gpstracker/internal/message/NotificationBroker.java b/bundles/org.openhab.binding.gpstracker/src/main/java/org/openhab/binding/gpstracker/internal/message/NotificationBroker.java index cfb3b5900..b92a5772a 100644 --- a/bundles/org.openhab.binding.gpstracker/src/main/java/org/openhab/binding/gpstracker/internal/message/NotificationBroker.java +++ b/bundles/org.openhab.binding.gpstracker/src/main/java/org/openhab/binding/gpstracker/internal/message/NotificationBroker.java @@ -15,11 +15,15 @@ package org.openhab.binding.gpstracker.internal.message; import java.util.HashMap; import java.util.Map; +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.openhab.binding.gpstracker.internal.message.dto.LocationMessage; + /** * Notification broker. * * @author Gabor Bicskei - Initial contribution */ +@NonNullByDefault public class NotificationBroker { /** * Handlers diff --git a/bundles/org.openhab.binding.gpstracker/src/main/java/org/openhab/binding/gpstracker/internal/message/NotificationHandler.java b/bundles/org.openhab.binding.gpstracker/src/main/java/org/openhab/binding/gpstracker/internal/message/NotificationHandler.java index bc7e1eab6..446ebd626 100644 --- a/bundles/org.openhab.binding.gpstracker/src/main/java/org/openhab/binding/gpstracker/internal/message/NotificationHandler.java +++ b/bundles/org.openhab.binding.gpstracker/src/main/java/org/openhab/binding/gpstracker/internal/message/NotificationHandler.java @@ -17,11 +17,16 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.openhab.binding.gpstracker.internal.message.dto.LocationMessage; +import org.openhab.binding.gpstracker.internal.message.dto.TransitionMessage; + /** * Handler for notification messages between trackers. * * @author Gabor Bicskei - Initial contribution */ +@NonNullByDefault public class NotificationHandler { /** * Location notifications need to be sent to the own tracker. Only the last location is saved for each tracker @@ -46,7 +51,9 @@ public class NotificationHandler { if (msg instanceof TransitionMessage) { List transitionMessages = transitionNotifications.computeIfAbsent(trackerId, k -> new ArrayList<>()); - transitionMessages.add((TransitionMessage) msg); + if (transitionMessages != null) { + transitionMessages.add((TransitionMessage) msg); + } } else { locationNotifications.put(trackerId, msg); } diff --git a/bundles/org.openhab.binding.gpstracker/src/main/java/org/openhab/binding/gpstracker/internal/message/LocationMessage.java b/bundles/org.openhab.binding.gpstracker/src/main/java/org/openhab/binding/gpstracker/internal/message/dto/LocationMessage.java similarity index 84% rename from bundles/org.openhab.binding.gpstracker/src/main/java/org/openhab/binding/gpstracker/internal/message/LocationMessage.java rename to bundles/org.openhab.binding.gpstracker/src/main/java/org/openhab/binding/gpstracker/internal/message/dto/LocationMessage.java index a3c1baa87..05ad029c4 100644 --- a/bundles/org.openhab.binding.gpstracker/src/main/java/org/openhab/binding/gpstracker/internal/message/LocationMessage.java +++ b/bundles/org.openhab.binding.gpstracker/src/main/java/org/openhab/binding/gpstracker/internal/message/dto/LocationMessage.java @@ -10,7 +10,7 @@ * * SPDX-License-Identifier: EPL-2.0 */ -package org.openhab.binding.gpstracker.internal.message; +package org.openhab.binding.gpstracker.internal.message.dto; import java.math.BigDecimal; import java.time.ZoneId; @@ -49,6 +49,12 @@ public class LocationMessage { @SerializedName("tid") private String trackerId = ""; + /** + * Altitude (iOS, Android/integer/meters/optional) + */ + @SerializedName("alt") + private Integer altitude = Integer.MIN_VALUE; + /** * Latitude (iOS, Android/float/meters/required) */ @@ -103,7 +109,9 @@ public class LocationMessage { * @return Conversion result */ public State getTrackerLocation() { - if (!BigDecimal.ZERO.equals(latitude) && !BigDecimal.ZERO.equals(longitude)) { + if (!BigDecimal.ZERO.equals(latitude) && !BigDecimal.ZERO.equals(longitude) && Integer.MIN_VALUE != altitude) { + return new PointType(new DecimalType(latitude), new DecimalType(longitude), new DecimalType(altitude)); + } else if (!BigDecimal.ZERO.equals(latitude) && !BigDecimal.ZERO.equals(longitude)) { return new PointType(new DecimalType(latitude), new DecimalType(longitude)); } return UnDefType.UNDEF; @@ -122,8 +130,9 @@ public class LocationMessage { } public State getGpsAccuracy() { - if (gpsAccuracy != null) { - return new QuantityType<>(gpsAccuracy.intValue(), SIUnits.METRE); + BigDecimal gpsAccuracyLocal = gpsAccuracy; + if (gpsAccuracyLocal != null) { + return new QuantityType<>(gpsAccuracyLocal.intValue(), SIUnits.METRE); } return UnDefType.UNDEF; } @@ -131,7 +140,7 @@ public class LocationMessage { @Override public String toString() { return "LocationMessage [" + ("type=" + type + ", ") + ("trackerId=" + trackerId + ", ") - + ("latitude=" + latitude + ", ") + ("longitude=" + longitude + ", ") + + ("latitude=" + latitude + ", ") + ("longitude=" + longitude + ", ") + ("altitude=" + altitude + ", ") + (gpsAccuracy != null ? "gpsAccuracy=" + gpsAccuracy + ", " : "") + ("batteryLevel=" + batteryLevel + ", ") + ("timestampMillis=" + timestampMillis) + "]"; } diff --git a/bundles/org.openhab.binding.gpstracker/src/main/java/org/openhab/binding/gpstracker/internal/message/TransitionMessage.java b/bundles/org.openhab.binding.gpstracker/src/main/java/org/openhab/binding/gpstracker/internal/message/dto/TransitionMessage.java similarity index 94% rename from bundles/org.openhab.binding.gpstracker/src/main/java/org/openhab/binding/gpstracker/internal/message/TransitionMessage.java rename to bundles/org.openhab.binding.gpstracker/src/main/java/org/openhab/binding/gpstracker/internal/message/dto/TransitionMessage.java index 21ba87901..e482ae81c 100644 --- a/bundles/org.openhab.binding.gpstracker/src/main/java/org/openhab/binding/gpstracker/internal/message/TransitionMessage.java +++ b/bundles/org.openhab.binding.gpstracker/src/main/java/org/openhab/binding/gpstracker/internal/message/dto/TransitionMessage.java @@ -10,7 +10,7 @@ * * SPDX-License-Identifier: EPL-2.0 */ -package org.openhab.binding.gpstracker.internal.message; +package org.openhab.binding.gpstracker.internal.message.dto; import com.google.gson.annotations.SerializedName; diff --git a/bundles/org.openhab.binding.gpstracker/src/main/java/org/openhab/binding/gpstracker/internal/provider/AbstractCallbackServlet.java b/bundles/org.openhab.binding.gpstracker/src/main/java/org/openhab/binding/gpstracker/internal/provider/AbstractCallbackServlet.java index b6bc06598..c92b75fca 100644 --- a/bundles/org.openhab.binding.gpstracker/src/main/java/org/openhab/binding/gpstracker/internal/provider/AbstractCallbackServlet.java +++ b/bundles/org.openhab.binding.gpstracker/src/main/java/org/openhab/binding/gpstracker/internal/provider/AbstractCallbackServlet.java @@ -20,11 +20,13 @@ import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.eclipse.jdt.annotation.Nullable; import org.openhab.binding.gpstracker.internal.discovery.TrackerDiscoveryService; import org.openhab.binding.gpstracker.internal.handler.TrackerHandler; -import org.openhab.binding.gpstracker.internal.message.LocationMessage; import org.openhab.binding.gpstracker.internal.message.MessageUtil; -import org.openhab.binding.gpstracker.internal.message.TransitionMessage; +import org.openhab.binding.gpstracker.internal.message.dto.LocationMessage; +import org.openhab.binding.gpstracker.internal.message.dto.TransitionMessage; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -33,6 +35,7 @@ import org.slf4j.LoggerFactory; * * @author Gabor Bicskei - Initial contribution */ +@NonNullByDefault public abstract class AbstractCallbackServlet extends HttpServlet { private static final long serialVersionUID = -2725161358635927815L; @@ -139,16 +142,15 @@ public abstract class AbstractCallbackServlet extends HttpServlet { * @param trackerId Tracker id. * @return Handler for tracker. */ - private TrackerHandler getHandlerById(String trackerId) { - if (trackerId != null) { - TrackerHandler handler = trackerRegistry.getTrackerHandler(trackerId); - if (handler == null) { - // handler was not found - adding the tracker to discovery service. - discoveryService.addTracker(trackerId); - } else { - return handler; - } + private @Nullable TrackerHandler getHandlerById(String trackerId) { + TrackerHandler handler = trackerRegistry.getTrackerHandler(trackerId); + if (handler == null) { + // handler was not found - adding the tracker to discovery service. + discoveryService.addTracker(trackerId); + } else { + return handler; } + return null; } diff --git a/bundles/org.openhab.binding.gpstracker/src/main/java/org/openhab/binding/gpstracker/internal/provider/gpslogger/GPSLoggerCallbackServlet.java b/bundles/org.openhab.binding.gpstracker/src/main/java/org/openhab/binding/gpstracker/internal/provider/gpslogger/GPSLoggerCallbackServlet.java index b044fa90e..7a9339bfe 100644 --- a/bundles/org.openhab.binding.gpstracker/src/main/java/org/openhab/binding/gpstracker/internal/provider/gpslogger/GPSLoggerCallbackServlet.java +++ b/bundles/org.openhab.binding.gpstracker/src/main/java/org/openhab/binding/gpstracker/internal/provider/gpslogger/GPSLoggerCallbackServlet.java @@ -12,6 +12,7 @@ */ package org.openhab.binding.gpstracker.internal.provider.gpslogger; +import org.eclipse.jdt.annotation.NonNullByDefault; import org.openhab.binding.gpstracker.internal.discovery.TrackerDiscoveryService; import org.openhab.binding.gpstracker.internal.provider.AbstractCallbackServlet; import org.openhab.binding.gpstracker.internal.provider.TrackerRegistry; @@ -21,6 +22,7 @@ import org.openhab.binding.gpstracker.internal.provider.TrackerRegistry; * * @author Gabor Bicskei - Initial contribution */ +@NonNullByDefault public class GPSLoggerCallbackServlet extends AbstractCallbackServlet { private static final long serialVersionUID = -6992472786850682196L; diff --git a/bundles/org.openhab.binding.gpstracker/src/main/java/org/openhab/binding/gpstracker/internal/provider/owntracks/OwnTracksCallbackServlet.java b/bundles/org.openhab.binding.gpstracker/src/main/java/org/openhab/binding/gpstracker/internal/provider/owntracks/OwnTracksCallbackServlet.java index 649d18b49..fcfe94f49 100644 --- a/bundles/org.openhab.binding.gpstracker/src/main/java/org/openhab/binding/gpstracker/internal/provider/owntracks/OwnTracksCallbackServlet.java +++ b/bundles/org.openhab.binding.gpstracker/src/main/java/org/openhab/binding/gpstracker/internal/provider/owntracks/OwnTracksCallbackServlet.java @@ -12,6 +12,7 @@ */ package org.openhab.binding.gpstracker.internal.provider.owntracks; +import org.eclipse.jdt.annotation.NonNullByDefault; import org.openhab.binding.gpstracker.internal.discovery.TrackerDiscoveryService; import org.openhab.binding.gpstracker.internal.provider.AbstractCallbackServlet; import org.openhab.binding.gpstracker.internal.provider.TrackerRegistry; @@ -21,6 +22,7 @@ import org.openhab.binding.gpstracker.internal.provider.TrackerRegistry; * * @author Gabor Bicskei - Initial contribution */ +@NonNullByDefault public class OwnTracksCallbackServlet extends AbstractCallbackServlet { private static final long serialVersionUID = -4053305903339688036L;