From e651aa6d0338b74aacb30bdd2857ea34b48b2b1c Mon Sep 17 00:00:00 2001 From: J-N-K Date: Wed, 13 Jan 2021 23:31:26 +0100 Subject: [PATCH] [amazonechocontrol] refactor arrays to modern types (#9476) * refactor arrays to modern types * address review comments Signed-off-by: Jan N. Klug --- .../internal/AccountServlet.java | 32 ++-- ...onEchoDynamicStateDescriptionProvider.java | 28 +-- .../internal/Connection.java | 174 ++++++------------ .../internal/WebSocketConnection.java | 4 +- .../discovery/SmartHomeDevicesDiscovery.java | 14 +- .../internal/handler/AccountHandler.java | 90 +++------ .../internal/handler/EchoHandler.java | 89 ++++----- .../handler/SmartHomeDeviceHandler.java | 46 ++--- .../internal/jsons/JsonActivities.java | 12 +- .../internal/jsons/JsonAscendingAlarm.java | 4 +- .../internal/jsons/JsonAutomation.java | 3 +- .../internal/jsons/JsonBluetoothStates.java | 9 +- .../jsons/JsonDeviceNotificationState.java | 4 +- .../internal/jsons/JsonDevices.java | 11 +- .../internal/jsons/JsonEnabledFeeds.java | 4 +- .../internal/jsons/JsonEqualizer.java | 2 +- .../internal/jsons/JsonFeed.java | 5 + .../internal/jsons/JsonMediaState.java | 5 +- .../internal/jsons/JsonMusicProvider.java | 2 +- .../jsons/JsonNotificationSounds.java | 4 +- .../jsons/JsonNotificationsResponse.java | 4 +- .../jsons/JsonRegisterAppRequest.java | 6 +- .../jsons/JsonSmartHomeCapabilities.java | 6 +- .../internal/jsons/JsonSmartHomeDevices.java | 51 ++--- .../jsons/JsonSmartHomeGroupIdentity.java | 6 +- .../internal/jsons/JsonSmartHomeGroups.java | 4 +- .../internal/jsons/JsonUsersMeResponse.java | 4 +- .../internal/jsons/JsonWakeWords.java | 4 +- .../internal/smarthome/Constants.java | 27 ++- .../smarthome/HandlerAcousticEventSensor.java | 7 +- .../internal/smarthome/HandlerBase.java | 66 +++---- .../HandlerBrightnessController.java | 9 +- .../smarthome/HandlerColorController.java | 11 +- .../HandlerColorTemperatureController.java | 11 +- .../HandlerPercentageController.java | 9 +- .../smarthome/HandlerPowerController.java | 14 +- .../HandlerPowerLevelController.java | 9 +- .../HandlerSecurityPanelController.java | 7 +- .../smarthome/HandlerTemperatureSensor.java | 7 +- .../HandlerThermostatController.java | 9 +- ...tHomeDeviceStateGroupUpdateCalculator.java | 13 +- 41 files changed, 374 insertions(+), 452 deletions(-) diff --git a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/AccountServlet.java b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/AccountServlet.java index c0a3d59e7b6..7d75f244545 100644 --- a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/AccountServlet.java +++ b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/AccountServlet.java @@ -20,9 +20,7 @@ import java.net.URISyntaxException; import java.net.URLDecoder; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; import javax.net.ssl.HttpsURLConnection; @@ -499,19 +497,14 @@ public class AccountServlet extends HttpServlet { private void renderCapabilities(Connection connection, Device device, StringBuilder html) { html.append("

Capabilities

"); html.append(""); - String[] capabilities = device.capabilities; - if (capabilities != null) { - for (String capability : capabilities) { - html.append(""); - } - } + device.getCapabilities().forEach(capability -> html.append("")); html.append("
Name
"); - html.append(StringEscapeUtils.escapeHtml(capability)); - html.append("
") + .append(StringEscapeUtils.escapeHtml(capability)).append("
"); } private void renderMusicProviderIdChannel(Connection connection, StringBuilder html) { - html.append("

" + StringEscapeUtils.escapeHtml("Channel " + CHANNEL_MUSIC_PROVIDER_ID) + "

"); + html.append("

").append(StringEscapeUtils.escapeHtml("Channel " + CHANNEL_MUSIC_PROVIDER_ID)) + .append("

"); html.append(""); List musicProviders = connection.getMusicProviders(); for (JsonMusicProvider musicProvider : musicProviders) { @@ -532,8 +525,8 @@ public class AccountServlet extends HttpServlet { } private void renderPlayAlarmSoundChannel(Connection connection, Device device, StringBuilder html) { - html.append("

" + StringEscapeUtils.escapeHtml("Channel " + CHANNEL_PLAY_ALARM_SOUND) + "

"); - JsonNotificationSound[] notificationSounds = null; + html.append("

").append(StringEscapeUtils.escapeHtml("Channel " + CHANNEL_PLAY_ALARM_SOUND)).append("

"); + List notificationSounds = List.of(); String errorMessage = "No notifications sounds found"; try { notificationSounds = connection.getNotificationSounds(device); @@ -541,7 +534,7 @@ public class AccountServlet extends HttpServlet { | InterruptedException e) { errorMessage = e.getLocalizedMessage(); } - if (notificationSounds != null) { + if (!notificationSounds.isEmpty()) { html.append("
NameValue
"); for (JsonNotificationSound notificationSound : notificationSounds) { if (notificationSound.folder == null && notificationSound.providerId != null @@ -562,7 +555,8 @@ public class AccountServlet extends HttpServlet { } private void renderAmazonMusicPlaylistIdChannel(Connection connection, Device device, StringBuilder html) { - html.append("

" + StringEscapeUtils.escapeHtml("Channel " + CHANNEL_AMAZON_MUSIC_PLAY_LIST_ID) + "

"); + html.append("

").append(StringEscapeUtils.escapeHtml("Channel " + CHANNEL_AMAZON_MUSIC_PLAY_LIST_ID)) + .append("

"); JsonPlaylists playLists = null; String errorMessage = "No playlists found"; @@ -600,7 +594,7 @@ public class AccountServlet extends HttpServlet { } private void renderBluetoothMacChannel(Connection connection, Device device, StringBuilder html) { - html.append("

" + StringEscapeUtils.escapeHtml("Channel " + CHANNEL_BLUETOOTH_MAC) + "

"); + html.append("

").append(StringEscapeUtils.escapeHtml("Channel " + CHANNEL_BLUETOOTH_MAC)).append("

"); JsonBluetoothStates bluetoothStates = connection.getBluetoothConnectionStates(); if (bluetoothStates == null) { return; @@ -616,8 +610,8 @@ public class AccountServlet extends HttpServlet { String stateDeviceSerialNumber = state.deviceSerialNumber; if ((stateDeviceSerialNumber == null && device.serialNumber == null) || (stateDeviceSerialNumber != null && stateDeviceSerialNumber.equals(device.serialNumber))) { - PairedDevice[] pairedDeviceList = state.pairedDeviceList; - if (pairedDeviceList != null && pairedDeviceList.length > 0) { + List pairedDeviceList = state.getPairedDeviceList(); + if (pairedDeviceList.size() > 0) { html.append("
NameValue
"); for (PairedDevice pairedDevice : pairedDeviceList) { html.append("
NameValue
"); diff --git a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/AmazonEchoDynamicStateDescriptionProvider.java b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/AmazonEchoDynamicStateDescriptionProvider.java index e99141f131c..f753873dd8a 100644 --- a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/AmazonEchoDynamicStateDescriptionProvider.java +++ b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/AmazonEchoDynamicStateDescriptionProvider.java @@ -14,11 +14,7 @@ package org.openhab.binding.amazonechocontrol.internal; import static org.openhab.binding.amazonechocontrol.internal.AmazonEchoControlBindingConstants.*; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Locale; -import java.util.Map; +import java.util.*; import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.jdt.annotation.Nullable; @@ -106,17 +102,13 @@ public class AmazonEchoDynamicStateDescriptionProvider implements DynamicStateDe if (bluetoothState == null) { return null; } - PairedDevice[] pairedDeviceList = bluetoothState.pairedDeviceList; - if (pairedDeviceList == null) { + List pairedDeviceList = bluetoothState.getPairedDeviceList(); + if (pairedDeviceList.isEmpty()) { return null; } - List options = new ArrayList<>(); options.add(new StateOption("", "")); for (PairedDevice device : pairedDeviceList) { - if (device == null) { - continue; - } final String value = device.address; if (value != null && device.friendlyName != null) { options.add(new StateOption(value, device.friendlyName)); @@ -160,8 +152,8 @@ public class AmazonEchoDynamicStateDescriptionProvider implements DynamicStateDe return null; } - JsonNotificationSound[] notificationSounds = handler.findAlarmSounds(); - if (notificationSounds == null) { + List notificationSounds = handler.findAlarmSounds(); + if (notificationSounds.isEmpty()) { return null; } @@ -169,9 +161,8 @@ public class AmazonEchoDynamicStateDescriptionProvider implements DynamicStateDe options.add(new StateOption("", "")); for (JsonNotificationSound notificationSound : notificationSounds) { - if (notificationSound != null && notificationSound.folder == null - && notificationSound.providerId != null && notificationSound.id != null - && notificationSound.displayName != null) { + if (notificationSound.folder == null && notificationSound.providerId != null + && notificationSound.id != null && notificationSound.displayName != null) { String providerSoundId = notificationSound.providerId + ":" + notificationSound.id; options.add(new StateOption(providerSoundId, notificationSound.displayName)); } @@ -197,8 +188,7 @@ public class AmazonEchoDynamicStateDescriptionProvider implements DynamicStateDe options.add(new StateOption("", "")); for (Device device : devices) { final String value = device.serialNumber; - if (value != null && device.capabilities != null - && Arrays.asList(device.capabilities).contains("FLASH_BRIEFING")) { + if (value != null && device.getCapabilities().contains("FLASH_BRIEFING")) { options.add(new StateOption(value, device.accountName)); } } @@ -210,7 +200,7 @@ public class AmazonEchoDynamicStateDescriptionProvider implements DynamicStateDe return null; } List musicProviders = handler.findMusicProviders(); - if (musicProviders == null) { + if (musicProviders.isEmpty()) { return null; } diff --git a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/Connection.java b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/Connection.java index a1197d17c9d..b3fb362f373 100644 --- a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/Connection.java +++ b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/Connection.java @@ -53,7 +53,6 @@ import org.openhab.binding.amazonechocontrol.internal.jsons.JsonAscendingAlarm; import org.openhab.binding.amazonechocontrol.internal.jsons.JsonAscendingAlarm.AscendingAlarmModel; import org.openhab.binding.amazonechocontrol.internal.jsons.JsonAutomation; import org.openhab.binding.amazonechocontrol.internal.jsons.JsonAutomation.Payload; -import org.openhab.binding.amazonechocontrol.internal.jsons.JsonAutomation.Trigger; import org.openhab.binding.amazonechocontrol.internal.jsons.JsonBluetoothStates; import org.openhab.binding.amazonechocontrol.internal.jsons.JsonBootstrapResult; import org.openhab.binding.amazonechocontrol.internal.jsons.JsonBootstrapResult.Authentication; @@ -483,15 +482,13 @@ public class Connection { try { String bootstrapResultJson = convertStream(connection); JsonBootstrapResult result = parseJson(bootstrapResultJson, JsonBootstrapResult.class); - if (result != null) { - Authentication authentication = result.authentication; - if (authentication != null && authentication.authenticated) { - this.customerName = authentication.customerName; - if (this.accountCustomerId == null) { - this.accountCustomerId = authentication.customerId; - } - return authentication; + Authentication authentication = result.authentication; + if (authentication != null && authentication.authenticated) { + this.customerName = authentication.customerName; + if (this.accountCustomerId == null) { + this.accountCustomerId = authentication.customerId; } + return authentication; } } catch (JsonSyntaxException | IllegalStateException e) { logger.info("No valid json received", e); @@ -726,11 +723,8 @@ public class Connection { webSiteCookies.add(new JsonWebSiteCookie(cookie.getName(), cookie.getValue())); } - JsonWebSiteCookie[] webSiteCookiesArray = new JsonWebSiteCookie[webSiteCookies.size()]; - webSiteCookiesArray = webSiteCookies.toArray(webSiteCookiesArray); - JsonRegisterAppRequest registerAppRequest = new JsonRegisterAppRequest(serial, accessToken, frc, - webSiteCookiesArray); + webSiteCookies); String registerAppRequestJson = gson.toJson(registerAppRequest); HashMap registerHeaders = new HashMap<>(); @@ -740,9 +734,6 @@ public class Connection { registerAppRequestJson, true, registerHeaders); JsonRegisterAppResponse registerAppResponse = parseJson(registerAppResultJson, JsonRegisterAppResponse.class); - if (registerAppResponse == null) { - throw new ConnectionException("Error: No response received from register application"); - } Response response = registerAppResponse.response; if (response == null) { throw new ConnectionException("Error: No response received from register application"); @@ -770,9 +761,6 @@ public class Connection { String usersMeResponseJson = makeRequestAndReturnString("GET", "https://alexa.amazon.com/api/users/me?platform=ios&version=2.2.223830.0", null, false, null); JsonUsersMeResponse usersMeResponse = parseJson(usersMeResponseJson, JsonUsersMeResponse.class); - if (usersMeResponse == null) { - throw new IllegalArgumentException("Received no response on me-request"); - } URI uri = new URI(usersMeResponse.marketPlaceDomainName); String host = uri.getHost(); @@ -928,6 +916,7 @@ public class Connection { } } + @SuppressWarnings("null") // current value in compute can be null private void replaceTimer(TimerType type, @Nullable ScheduledFuture newTimer) { timers.compute(type, (timerType, oldTimer) -> { if (oldTimer != null) { @@ -967,9 +956,10 @@ public class Connection { } // parser - private @Nullable T parseJson(String json, Class type) throws JsonSyntaxException, IllegalStateException { + private T parseJson(String json, Class type) throws JsonSyntaxException, IllegalStateException { try { - return gson.fromJson(json, type); + // gson.fromJson is always non-null if json is non-null + return Objects.requireNonNull(gson.fromJson(json, type)); } catch (JsonParseException | IllegalStateException e) { logger.warn("Parsing json failed: {}", json, e); throw e; @@ -977,21 +967,16 @@ public class Connection { } // commands and states - public WakeWord[] getWakeWords() { + public List getWakeWords() { String json; try { json = makeRequestAndReturnString(alexaServer + "/api/wake-word?cached=true"); JsonWakeWords wakeWords = parseJson(json, JsonWakeWords.class); - if (wakeWords != null) { - WakeWord[] result = wakeWords.wakeWords; - if (result != null) { - return result; - } - } + return Objects.requireNonNullElse(wakeWords.wakeWords, List.of()); } catch (IOException | URISyntaxException | InterruptedException e) { logger.info("getting wakewords failed", e); } - return new WakeWord[0]; + return List.of(); } public List getSmarthomeDeviceList() @@ -1001,9 +986,6 @@ public class Connection { logger.debug("getSmartHomeDevices result: {}", json); JsonNetworkDetails networkDetails = parseJson(json, JsonNetworkDetails.class); - if (networkDetails == null) { - throw new IllegalArgumentException("received no response on network detail request"); - } Object jsonObject = gson.fromJson(networkDetails.networkDetail, Object.class); List result = new ArrayList<>(); searchSmartHomeDevicesRecursive(jsonObject, result); @@ -1023,15 +1005,11 @@ public class Connection { // device node found, create type element and add it to the results JsonElement element = gson.toJsonTree(jsonNode); SmartHomeDevice shd = parseJson(element.toString(), SmartHomeDevice.class); - if (shd != null) { - devices.add(shd); - } + devices.add(shd); } else if (map.containsKey("applianceGroupName")) { JsonElement element = gson.toJsonTree(jsonNode); SmartHomeGroup shg = parseJson(element.toString(), SmartHomeGroup.class); - if (shg != null) { - devices.add(shg); - } + devices.add(shg); } else { map.values().forEach(value -> searchSmartHomeDevicesRecursive(value, devices)); } @@ -1062,8 +1040,10 @@ public class Connection { String applianceId = device.findId(); if (applianceId != null) { JsonObject stateRequest; - if (device instanceof SmartHomeDevice && !((SmartHomeDevice) device).mergedApplianceIds.isEmpty()) { - for (String idToMerge : ((SmartHomeDevice) device).mergedApplianceIds) { + if (device instanceof SmartHomeDevice && ((SmartHomeDevice) device).mergedApplianceIds != null) { + List mergedApplianceIds = Objects + .requireNonNullElse(((SmartHomeDevice) device).mergedApplianceIds, List.of()); + for (String idToMerge : mergedApplianceIds) { mergedApplianceMap.put(idToMerge, applianceId); stateRequest = new JsonObject(); stateRequest.addProperty("entityId", idToMerge); @@ -1125,22 +1105,16 @@ public class Connection { return mediaState; } - public Activity[] getActivities(int number, @Nullable Long startTime) { - String json; + public List getActivities(int number, @Nullable Long startTime) { try { - json = makeRequestAndReturnString(alexaServer + "/api/activities?startTime=" + String json = makeRequestAndReturnString(alexaServer + "/api/activities?startTime=" + (startTime != null ? startTime : "") + "&size=" + number + "&offset=1"); JsonActivities activities = parseJson(json, JsonActivities.class); - if (activities != null) { - Activity[] activiesArray = activities.activities; - if (activiesArray != null) { - return activiesArray; - } - } + return Objects.requireNonNullElse(activities.activities, List.of()); } catch (IOException | URISyntaxException | InterruptedException e) { logger.info("getting activities failed", e); } - return new Activity[0]; + return List.of(); } public @Nullable JsonBluetoothStates getBluetoothConnectionStates() { @@ -1211,17 +1185,16 @@ public class Connection { String resultBody = makeRequestAndReturnString("PUT", url, requestBody, true, null); logger.trace("Request '{}' resulted in '{}", requestBody, resultBody); JsonObject result = parseJson(resultBody, JsonObject.class); - if (result != null) { - JsonElement errors = result.get("errors"); - if (errors != null && errors.isJsonArray()) { - JsonArray errorList = errors.getAsJsonArray(); - if (errorList.size() > 0) { - logger.warn("Smart home device command failed. The request '{}' resulted in error(s): {}", - requestBody, StreamSupport.stream(errorList.spliterator(), false) - .map(JsonElement::toString).collect(Collectors.joining(" / "))); - } + JsonElement errors = result.get("errors"); + if (errors != null && errors.isJsonArray()) { + JsonArray errorList = errors.getAsJsonArray(); + if (errorList.size() > 0) { + logger.warn("Smart home device command failed. The request '{}' resulted in error(s): {}", + requestBody, StreamSupport.stream(errorList.spliterator(), false).map(JsonElement::toString) + .collect(Collectors.joining(" / "))); } } + } catch (URISyntaxException e) { logger.warn("URL '{}' has invalid format for request '{}': {}", url, requestBody, e.getMessage()); } @@ -1245,38 +1218,28 @@ public class Connection { makeRequest("PUT", url, command, true, true, null, 0); } - public DeviceNotificationState[] getDeviceNotificationStates() { - String json; + public List getDeviceNotificationStates() { try { - json = makeRequestAndReturnString(alexaServer + "/api/device-notification-state"); + String json = makeRequestAndReturnString(alexaServer + "/api/device-notification-state"); JsonDeviceNotificationState result = parseJson(json, JsonDeviceNotificationState.class); - if (result != null) { - DeviceNotificationState[] deviceNotificationStates = result.deviceNotificationStates; - if (deviceNotificationStates != null) { - return deviceNotificationStates; - } - } + return Objects.requireNonNullElse(result.deviceNotificationStates, List.of()); + } catch (IOException | URISyntaxException | InterruptedException e) { logger.info("Error getting device notification states", e); } - return new DeviceNotificationState[0]; + return List.of(); } - public AscendingAlarmModel[] getAscendingAlarm() { + public List getAscendingAlarm() { String json; try { json = makeRequestAndReturnString(alexaServer + "/api/ascending-alarm"); JsonAscendingAlarm result = parseJson(json, JsonAscendingAlarm.class); - if (result != null) { - AscendingAlarmModel[] ascendingAlarmModelList = result.ascendingAlarmModelList; - if (ascendingAlarmModelList != null) { - return ascendingAlarmModelList; - } - } + return Objects.requireNonNullElse(result.ascendingAlarmModelList, List.of()); } catch (IOException | URISyntaxException | InterruptedException e) { logger.info("Error getting device notification states", e); } - return new AscendingAlarmModel[0]; + return List.of(); } public void bluetooth(Device device, @Nullable String address) @@ -1630,6 +1593,7 @@ public class Connection { logger.debug("added {} device {}", queueObject.hashCode(), serialNumbers); } + @SuppressWarnings("null") // peek can return null private void handleExecuteSequenceNode() { Lock lock = Objects.requireNonNull(locks.computeIfAbsent(TimerType.DEVICES, k -> new ReentrantLock())); if (lock.tryLock()) { @@ -1853,12 +1817,9 @@ public class Connection { } for (JsonAutomation routine : routines) { if (routine != null) { - Trigger[] triggers = routine.triggers; - if (triggers != null && routine.sequence != null) { + if (routine.sequence != null) { + List triggers = Objects.requireNonNullElse(routine.triggers, List.of()); for (JsonAutomation.Trigger trigger : triggers) { - if (trigger == null) { - continue; - } Payload payload = trigger.payload; if (payload == null) { continue; @@ -1921,20 +1882,13 @@ public class Connection { return result; } - public JsonFeed[] getEnabledFlashBriefings() throws IOException, URISyntaxException, InterruptedException { + public List getEnabledFlashBriefings() throws IOException, URISyntaxException, InterruptedException { String json = makeRequestAndReturnString(alexaServer + "/api/content-skills/enabled-feeds"); JsonEnabledFeeds result = parseJson(json, JsonEnabledFeeds.class); - if (result == null) { - return new JsonFeed[0]; - } - JsonFeed[] enabledFeeds = result.enabledFeeds; - if (enabledFeeds != null) { - return enabledFeeds; - } - return new JsonFeed[0]; + return Objects.requireNonNullElse(result.enabledFeeds, List.of()); } - public void setEnabledFlashBriefings(JsonFeed[] enabledFlashBriefing) + public void setEnabledFlashBriefings(List enabledFlashBriefing) throws IOException, URISyntaxException, InterruptedException { JsonEnabledFeeds enabled = new JsonEnabledFeeds(); enabled.enabledFeeds = enabledFlashBriefing; @@ -1942,33 +1896,19 @@ public class Connection { makeRequest("POST", alexaServer + "/api/content-skills/enabled-feeds", json, true, true, null, 0); } - public JsonNotificationSound[] getNotificationSounds(Device device) + public List getNotificationSounds(Device device) throws IOException, URISyntaxException, InterruptedException { String json = makeRequestAndReturnString( alexaServer + "/api/notification/sounds?deviceSerialNumber=" + device.serialNumber + "&deviceType=" + device.deviceType + "&softwareVersion=" + device.softwareVersion); JsonNotificationSounds result = parseJson(json, JsonNotificationSounds.class); - if (result == null) { - return new JsonNotificationSound[0]; - } - JsonNotificationSound[] notificationSounds = result.notificationSounds; - if (notificationSounds != null) { - return notificationSounds; - } - return new JsonNotificationSound[0]; + return Objects.requireNonNullElse(result.notificationSounds, List.of()); } - public JsonNotificationResponse[] notifications() throws IOException, URISyntaxException, InterruptedException { + public List notifications() throws IOException, URISyntaxException, InterruptedException { String response = makeRequestAndReturnString(alexaServer + "/api/notifications"); JsonNotificationsResponse result = parseJson(response, JsonNotificationsResponse.class); - if (result == null) { - return new JsonNotificationResponse[0]; - } - JsonNotificationResponse[] notifications = result.notifications; - if (notifications == null) { - return new JsonNotificationResponse[0]; - } - return notifications; + return Objects.requireNonNullElse(result.notifications, List.of()); } public @Nullable JsonNotificationResponse notification(Device device, String type, @Nullable String label, @@ -2019,8 +1959,8 @@ public class Connection { String response = makeRequestAndReturnString("GET", alexaServer + "/api/behaviors/entities?skillId=amzn1.ask.1p.music", null, true, headers); if (!response.isEmpty()) { - JsonMusicProvider[] result = parseJson(response, JsonMusicProvider[].class); - return Arrays.asList(result); + JsonMusicProvider[] musicProviders = parseJson(response, JsonMusicProvider[].class); + return Arrays.asList(musicProviders); } } catch (IOException | URISyntaxException | InterruptedException e) { logger.warn("getMusicProviders fails: {}", e.getMessage()); @@ -2050,12 +1990,10 @@ public class Connection { if (!validateResultJson.isEmpty()) { JsonPlayValidationResult validationResult = parseJson(validateResultJson, JsonPlayValidationResult.class); - if (validationResult != null) { - JsonPlaySearchPhraseOperationPayload validatedOperationPayload = validationResult.operationPayload; - if (validatedOperationPayload != null) { - payload.sanitizedSearchPhrase = validatedOperationPayload.sanitizedSearchPhrase; - payload.searchPhrase = validatedOperationPayload.searchPhrase; - } + JsonPlaySearchPhraseOperationPayload validatedOperationPayload = validationResult.operationPayload; + if (validatedOperationPayload != null) { + payload.sanitizedSearchPhrase = validatedOperationPayload.sanitizedSearchPhrase; + payload.searchPhrase = validatedOperationPayload.searchPhrase; } } diff --git a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/WebSocketConnection.java b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/WebSocketConnection.java index 2a0ec2e35f6..410f0312ae4 100644 --- a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/WebSocketConnection.java +++ b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/WebSocketConnection.java @@ -73,9 +73,7 @@ public class WebSocketConnection { IWebSocketCommandHandler webSocketCommandHandler) throws IOException { this.webSocketCommandHandler = webSocketCommandHandler; amazonEchoControlWebSocket = new AmazonEchoControlWebSocket(); - - SslContextFactory sslContextFactory = new SslContextFactory(); - webSocketClient = new WebSocketClient(sslContextFactory); + webSocketClient = new WebSocketClient(new SslContextFactory.Client()); try { String host; if (amazonSite.equalsIgnoreCase("amazon.com")) { diff --git a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/discovery/SmartHomeDevicesDiscovery.java b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/discovery/SmartHomeDevicesDiscovery.java index 8e4c07652ed..d69a041a56b 100644 --- a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/discovery/SmartHomeDevicesDiscovery.java +++ b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/discovery/SmartHomeDevicesDiscovery.java @@ -22,14 +22,12 @@ import java.util.Map; import java.util.Set; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; -import java.util.stream.Stream; import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.jdt.annotation.Nullable; import org.openhab.binding.amazonechocontrol.internal.Connection; import org.openhab.binding.amazonechocontrol.internal.handler.AccountHandler; import org.openhab.binding.amazonechocontrol.internal.handler.SmartHomeDeviceHandler; -import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeCapabilities; import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeDeviceAlias; import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeDevices.DriverIdentity; import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeDevices.SmartHomeDevice; @@ -171,25 +169,23 @@ public class SmartHomeDevicesDiscovery extends AbstractDiscoveryService { continue; } - JsonSmartHomeCapabilities.SmartHomeCapability[] capabilities = shd.capabilities; - if (capabilities == null || Stream.of(capabilities).noneMatch(capability -> capability != null - && Constants.SUPPORTED_INTERFACES.contains(capability.interfaceName))) { + if (shd.getCapabilities().stream() + .noneMatch(capability -> Constants.SUPPORTED_INTERFACES.contains(capability.interfaceName))) { // No supported interface found continue; } thingUID = new ThingUID(THING_TYPE_SMART_HOME_DEVICE, bridgeThingUID, entityId.replace(".", "-")); - JsonSmartHomeDeviceAlias[] aliases = shd.aliases; + List aliases = shd.aliases; if ("Amazon".equals(shd.manufacturerName) && driverIdentity != null && "SonarCloudService".equals(driverIdentity.identifier)) { deviceName = "Alexa Guard on " + shd.friendlyName; } else if ("Amazon".equals(shd.manufacturerName) && driverIdentity != null && "OnGuardSmartHomeBridgeService".equals(driverIdentity.identifier)) { deviceName = "Alexa Guard"; - } else if (aliases != null && aliases.length > 0 && aliases[0] != null - && aliases[0].friendlyName != null) { - deviceName = aliases[0].friendlyName; + } else if (aliases != null && !aliases.isEmpty() && aliases.get(0).friendlyName != null) { + deviceName = aliases.get(0).friendlyName; } else { deviceName = shd.friendlyName; } diff --git a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/handler/AccountHandler.java b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/handler/AccountHandler.java index 277b6708376..19077a583d2 100644 --- a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/handler/AccountHandler.java +++ b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/handler/AccountHandler.java @@ -17,15 +17,7 @@ import java.net.URISyntaxException; import java.net.URLEncoder; import java.net.UnknownHostException; import java.time.ZonedDateTime; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Set; +import java.util.*; import java.util.concurrent.CopyOnWriteArraySet; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ScheduledFuture; @@ -44,7 +36,6 @@ import org.openhab.binding.amazonechocontrol.internal.WebSocketConnection; import org.openhab.binding.amazonechocontrol.internal.channelhandler.ChannelHandler; import org.openhab.binding.amazonechocontrol.internal.channelhandler.ChannelHandlerSendMessage; import org.openhab.binding.amazonechocontrol.internal.channelhandler.IAmazonThingHandler; -import org.openhab.binding.amazonechocontrol.internal.jsons.JsonActivities.Activity.SourceDeviceId; import org.openhab.binding.amazonechocontrol.internal.jsons.JsonAscendingAlarm.AscendingAlarmModel; import org.openhab.binding.amazonechocontrol.internal.jsons.JsonBluetoothStates; import org.openhab.binding.amazonechocontrol.internal.jsons.JsonBluetoothStates.BluetoothState; @@ -473,18 +464,17 @@ public class AccountHandler extends BaseBridgeHandler implements IWebSocketComma if (!currentConnection.getIsLoggedIn()) { return; } - JsonNotificationResponse[] notifications; + ZonedDateTime timeStamp = ZonedDateTime.now(); try { - notifications = currentConnection.notifications(); + List notifications = currentConnection.notifications(); + ZonedDateTime timeStampNow = ZonedDateTime.now(); + echoHandlers.forEach(echoHandler -> echoHandler.updateNotifications(timeStamp, timeStampNow, pushPayload, + notifications)); } catch (IOException | URISyntaxException | InterruptedException e) { logger.debug("refreshNotifications failed", e); return; } - ZonedDateTime timeStampNow = ZonedDateTime.now(); - - echoHandlers.forEach( - echoHandler -> echoHandler.updateNotifications(timeStamp, timeStampNow, pushPayload, notifications)); } private void refreshData() { @@ -509,8 +499,8 @@ public class AccountHandler extends BaseBridgeHandler implements IWebSocketComma updateSmartHomeDeviceList(false); updateFlashBriefingHandlers(); - DeviceNotificationState[] deviceNotificationStates = null; - AscendingAlarmModel[] ascendingAlarmModels = null; + List deviceNotificationStates = List.of(); + List ascendingAlarmModels = List.of(); JsonBluetoothStates states = null; List musicProviders = null; if (currentConnection.getIsLoggedIn()) { @@ -536,7 +526,7 @@ public class AccountHandler extends BaseBridgeHandler implements IWebSocketComma for (EchoHandler child : echoHandlers) { Device device = findDeviceJson(child.findSerialNumber()); - JsonNotificationSound[] notificationSounds = null; + List notificationSounds = List.of(); JsonPlaylists playlists = null; if (device != null && currentConnection.getIsLoggedIn()) { // update notification sounds @@ -562,17 +552,12 @@ public class AccountHandler extends BaseBridgeHandler implements IWebSocketComma if (device != null) { final String serialNumber = device.serialNumber; if (serialNumber != null) { - if (ascendingAlarmModels != null) { - ascendingAlarmModel = Arrays.stream(ascendingAlarmModels).filter(Objects::nonNull) - .filter(current -> serialNumber.equals(current.deviceSerialNumber)).findFirst() - .orElse(null); - } - if (deviceNotificationStates != null) { - deviceNotificationState = Arrays.stream(deviceNotificationStates) - .filter(Objects::nonNull) - .filter(current -> serialNumber.equals(current.deviceSerialNumber)).findFirst() - .orElse(null); - } + ascendingAlarmModel = ascendingAlarmModels.stream() + .filter(current -> serialNumber.equals(current.deviceSerialNumber)).findFirst() + .orElse(null); + deviceNotificationState = deviceNotificationStates.stream() + .filter(current -> serialNumber.equals(current.deviceSerialNumber)).findFirst() + .orElse(null); } } child.updateState(this, device, state, deviceNotificationState, ascendingAlarmModel, playlists, @@ -631,19 +616,13 @@ public class AccountHandler extends BaseBridgeHandler implements IWebSocketComma .collect(Collectors.toMap(d -> Objects.requireNonNull(d.serialNumber), d -> d)); } - WakeWord[] wakeWords = currentConnection.getWakeWords(); + List wakeWords = currentConnection.getWakeWords(); // update handlers for (EchoHandler echoHandler : echoHandlers) { String serialNumber = echoHandler.findSerialNumber(); - String deviceWakeWord = null; - for (WakeWord wakeWord : wakeWords) { - if (wakeWord != null) { - if (serialNumber.equals(wakeWord.deviceSerialNumber)) { - deviceWakeWord = wakeWord.wakeWord; - break; - } - } - } + String deviceWakeWord = wakeWords.stream() + .filter(wakeWord -> serialNumber.equals(wakeWord.deviceSerialNumber)).findFirst() + .map(wakeWord -> wakeWord.wakeWord).orElse(null); echoHandler.setDeviceAndUpdateThingState(this, findDeviceJson(serialNumber), deviceWakeWord); } @@ -658,7 +637,7 @@ public class AccountHandler extends BaseBridgeHandler implements IWebSocketComma JsonFeed[] feeds = gson.fromJson(flashBriefingJson, JsonFeed[].class); if (currentConnection != null && feeds != null) { try { - currentConnection.setEnabledFlashBriefings(feeds); + currentConnection.setEnabledFlashBriefings(Arrays.asList(feeds)); } catch (IOException | URISyntaxException | InterruptedException e) { logger.warn("Set flashbriefing profile failed", e); } @@ -707,17 +686,9 @@ public class AccountHandler extends BaseBridgeHandler implements IWebSocketComma private void updateFlashBriefingProfiles(Connection currentConnection) { try { - JsonFeed[] feeds = currentConnection.getEnabledFlashBriefings(); // Make a copy and remove changeable parts - JsonFeed[] forSerializer = new JsonFeed[feeds.length]; - for (int i = 0; i < feeds.length; i++) { - JsonFeed source = feeds[i]; - JsonFeed copy = new JsonFeed(); - copy.feedId = source.feedId; - copy.skillId = source.skillId; - // Do not copy imageUrl here, because it will change - forSerializer[i] = copy; - } + JsonFeed[] forSerializer = currentConnection.getEnabledFlashBriefings().stream() + .map(source -> new JsonFeed(source.feedId, source.skillId)).toArray(JsonFeed[]::new); this.currentFlashBriefingJson = gson.toJson(forSerializer); } catch (HttpException | JsonSyntaxException | IOException | URISyntaxException | ConnectionException | InterruptedException e) { @@ -796,17 +767,12 @@ public class AccountHandler extends BaseBridgeHandler implements IWebSocketComma } String search = key.registeredUserId + "#" + key.entryId; - Arrays.stream(connection.getActivities(10, pushActivity.timestamp)) - .filter(activity -> activity != null && search.equals(activity.id)).findFirst() - .ifPresent(currentActivity -> { - SourceDeviceId[] sourceDeviceIds = currentActivity.sourceDeviceIds; - if (sourceDeviceIds != null) { - Arrays.stream(sourceDeviceIds).filter(Objects::nonNull) - .map(sourceDeviceId -> findEchoHandlerBySerialNumber(sourceDeviceId.serialNumber)) - .filter(Objects::nonNull).forEach(echoHandler -> Objects.requireNonNull(echoHandler) - .handlePushActivity(currentActivity)); - } - }); + connection.getActivities(10, pushActivity.timestamp).stream().filter(activity -> search.equals(activity.id)) + .findFirst() + .ifPresent(currentActivity -> currentActivity.getSourceDeviceIds().stream() + .map(sourceDeviceId -> findEchoHandlerBySerialNumber(sourceDeviceId.serialNumber)) + .filter(Objects::nonNull).forEach(echoHandler -> Objects.requireNonNull(echoHandler) + .handlePushActivity(currentActivity))); } void refreshAfterCommand() { diff --git a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/handler/EchoHandler.java b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/handler/EchoHandler.java index 40db3118491..342ecb323a2 100644 --- a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/handler/EchoHandler.java +++ b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/handler/EchoHandler.java @@ -24,8 +24,6 @@ import java.time.temporal.ChronoUnit; import java.util.*; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; -import java.util.stream.Collectors; -import java.util.stream.Stream; import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.jdt.annotation.Nullable; @@ -122,8 +120,8 @@ public class EchoHandler extends BaseThingHandler implements IEchoThingHandler { private @Nullable Integer notificationVolumeLevel; private @Nullable Boolean ascendingAlarm; private @Nullable JsonPlaylists playLists; - private @Nullable JsonNotificationSound @Nullable [] alarmSounds; - private @Nullable List musicProviders; + private List alarmSounds = List.of(); + private List musicProviders = List.of(); private List channelHandlers = new ArrayList<>(); private @Nullable JsonNotificationResponse currentNotification; @@ -163,10 +161,7 @@ public class EchoHandler extends BaseThingHandler implements IEchoThingHandler { return false; } this.device = device; - String[] capabilities = device.capabilities; - if (capabilities != null) { - this.capabilities = Stream.of(capabilities).filter(Objects::nonNull).collect(Collectors.toSet()); - } + this.capabilities = device.getCapabilities(); if (!device.online) { updateStatus(ThingStatus.OFFLINE); return false; @@ -204,11 +199,11 @@ public class EchoHandler extends BaseThingHandler implements IEchoThingHandler { return this.playLists; } - public @Nullable JsonNotificationSound @Nullable [] findAlarmSounds() { + public List findAlarmSounds() { return this.alarmSounds; } - public @Nullable List findMusicProviders() { + public List findMusicProviders() { return this.musicProviders; } @@ -444,17 +439,11 @@ public class EchoHandler extends BaseThingHandler implements IEchoThingHandler { String bluetoothId = lastKnownBluetoothMAC; BluetoothState state = bluetoothState; if (state != null && (bluetoothId == null || bluetoothId.isEmpty())) { - PairedDevice[] pairedDeviceList = state.pairedDeviceList; - if (pairedDeviceList != null) { - for (PairedDevice paired : pairedDeviceList) { - if (paired == null) { - continue; - } - String pairedAddress = paired.address; - if (pairedAddress != null && !pairedAddress.isEmpty()) { - lastKnownBluetoothMAC = pairedAddress; - break; - } + for (PairedDevice paired : state.getPairedDeviceList()) { + String pairedAddress = paired.address; + if (pairedAddress != null && !pairedAddress.isEmpty()) { + lastKnownBluetoothMAC = pairedAddress; + break; } } } @@ -806,8 +795,7 @@ public class EchoHandler extends BaseThingHandler implements IEchoThingHandler { public void updateState(AccountHandler accountHandler, @Nullable Device device, @Nullable BluetoothState bluetoothState, @Nullable DeviceNotificationState deviceNotificationState, @Nullable AscendingAlarmModel ascendingAlarmModel, @Nullable JsonPlaylists playlists, - @Nullable JsonNotificationSound @Nullable [] alarmSounds, - @Nullable List musicProviders) { + @Nullable List alarmSounds, @Nullable List musicProviders) { try { this.logger.debug("Handle updateState {}", this.getThing().getUID()); @@ -974,24 +962,19 @@ public class EchoHandler extends BaseThingHandler implements IEchoThingHandler { boolean bluetoothIsConnected = false; if (bluetoothState != null) { this.bluetoothState = bluetoothState; - PairedDevice[] pairedDeviceList = bluetoothState.pairedDeviceList; - if (pairedDeviceList != null) { - for (PairedDevice paired : pairedDeviceList) { - if (paired == null) { - continue; - } - String pairedAddress = paired.address; - if (paired.connected && pairedAddress != null) { - bluetoothIsConnected = true; - bluetoothMAC = pairedAddress; - bluetoothDeviceName = paired.friendlyName; - if (bluetoothDeviceName == null || bluetoothDeviceName.isEmpty()) { - bluetoothDeviceName = pairedAddress; - } - break; + for (PairedDevice paired : bluetoothState.getPairedDeviceList()) { + String pairedAddress = paired.address; + if (paired.connected && pairedAddress != null) { + bluetoothIsConnected = true; + bluetoothMAC = pairedAddress; + bluetoothDeviceName = paired.friendlyName; + if (bluetoothDeviceName == null || bluetoothDeviceName.isEmpty()) { + bluetoothDeviceName = pairedAddress; } + break; } } + } if (!bluetoothMAC.isEmpty()) { lastKnownBluetoothMAC = bluetoothMAC; @@ -1036,22 +1019,21 @@ public class EchoHandler extends BaseThingHandler implements IEchoThingHandler { } } if (mediaState != null) { - QueueEntry[] queueEntries = mediaState.queue; - if (queueEntries != null && queueEntries.length > 0) { - QueueEntry entry = queueEntries[0]; - if (entry != null) { - if (isRadio) { - if ((imageUrl == null || imageUrl.isEmpty()) && entry.imageURL != null) { - imageUrl = entry.imageURL; - } - if ((subTitle1 == null || subTitle1.isEmpty()) && entry.radioStationSlogan != null) { - subTitle1 = entry.radioStationSlogan; - } - if ((subTitle2 == null || subTitle2.isEmpty()) && entry.radioStationLocation != null) { - subTitle2 = entry.radioStationLocation; - } + List queueEntries = Objects.requireNonNullElse(mediaState.queue, List.of()); + if (!queueEntries.isEmpty()) { + QueueEntry entry = queueEntries.get(0); + if (isRadio) { + if ((imageUrl == null || imageUrl.isEmpty()) && entry.imageURL != null) { + imageUrl = entry.imageURL; + } + if ((subTitle1 == null || subTitle1.isEmpty()) && entry.radioStationSlogan != null) { + subTitle1 = entry.radioStationSlogan; + } + if ((subTitle2 == null || subTitle2.isEmpty()) && entry.radioStationLocation != null) { + subTitle2 = entry.radioStationLocation; } } + } } @@ -1287,7 +1269,8 @@ public class EchoHandler extends BaseThingHandler implements IEchoThingHandler { } public void updateNotifications(ZonedDateTime currentTime, ZonedDateTime now, - @Nullable JsonCommandPayloadPushNotificationChange pushPayload, JsonNotificationResponse[] notifications) { + @Nullable JsonCommandPayloadPushNotificationChange pushPayload, + List notifications) { Device device = this.device; if (device == null) { return; diff --git a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/handler/SmartHomeDeviceHandler.java b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/handler/SmartHomeDeviceHandler.java index 594215abfe1..c2bba5ad79a 100644 --- a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/handler/SmartHomeDeviceHandler.java +++ b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/handler/SmartHomeDeviceHandler.java @@ -16,7 +16,7 @@ import static org.openhab.binding.amazonechocontrol.internal.AmazonEchoControlBi import static org.openhab.binding.amazonechocontrol.internal.smarthome.Constants.SUPPORTED_INTERFACES; import java.util.*; -import java.util.function.Supplier; +import java.util.function.Function; import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.jdt.annotation.Nullable; @@ -93,15 +93,15 @@ public class SmartHomeDeviceHandler extends BaseThingHandler { if (handler != null) { unusedHandlers.remove(interfaceName); } else { - Supplier creator = Constants.HANDLER_FACTORY.get(interfaceName); + Function creator = Constants.HANDLER_FACTORY.get(interfaceName); if (creator != null) { - handler = creator.get(); + handler = creator.apply(this); handlers.put(interfaceName, handler); } } if (handler != null) { - Collection required = handler.initialize(this, - capabilities.getOrDefault(interfaceName, Collections.emptyList())); + Collection required = handler + .initialize(capabilities.getOrDefault(interfaceName, List.of())); for (ChannelInfo channelInfo : required) { unusedChannels.remove(channelInfo.channelId); if (addChannelToDevice(thingBuilder, channelInfo.channelId, channelInfo.itemType, @@ -289,13 +289,8 @@ public class SmartHomeDeviceHandler extends BaseThingHandler { if (entityId == null) { continue; } - SmartHomeCapability[] capabilities = shd.capabilities; - if (capabilities == null) { - logger.debug("capabilities is null in {}", thing.getUID()); - return; - } accountHandler.forceDelayedSmartHomeStateUpdate(getId()); // block updates - if (handlerBase.handleCommand(connection, shd, entityId, capabilities, channelUID.getId(), + if (handlerBase.handleCommand(connection, shd, entityId, shd.getCapabilities(), channelUID.getId(), command)) { accountHandler.forceDelayedSmartHomeStateUpdate(getId()); // force update again to restart // update timer @@ -312,11 +307,7 @@ public class SmartHomeDeviceHandler extends BaseThingHandler { SmartHomeBaseDevice device) { if (device instanceof SmartHomeDevice) { SmartHomeDevice shd = (SmartHomeDevice) device; - SmartHomeCapability[] capabilities = shd.capabilities; - if (capabilities == null) { - return; - } - for (SmartHomeCapability capability : capabilities) { + for (SmartHomeCapability capability : shd.getCapabilities()) { String interfaceName = capability.interfaceName; if (interfaceName != null) { Objects.requireNonNull(result.computeIfAbsent(interfaceName, name -> new ArrayList<>())) @@ -340,12 +331,10 @@ public class SmartHomeDeviceHandler extends BaseThingHandler { Set result = new HashSet<>(); if (baseDevice instanceof SmartHomeDevice) { SmartHomeDevice shd = (SmartHomeDevice) baseDevice; - SmartHomeCapability[] capabilities = shd.capabilities; - if (capabilities != null) { - if (Arrays.stream(capabilities).map(capability -> capability.interfaceName) - .anyMatch(SUPPORTED_INTERFACES::contains)) { - result.add(shd); - } + if (shd.getCapabilities().stream().map(capability -> capability.interfaceName) + .anyMatch(SUPPORTED_INTERFACES::contains)) { + result.add(shd); + } } else { SmartHomeGroup shg = (SmartHomeGroup) baseDevice; @@ -356,13 +345,12 @@ public class SmartHomeDeviceHandler extends BaseThingHandler { if (tags != null) { JsonSmartHomeGroupIdentity.SmartHomeGroupIdentity tagNameToValueSetMap = tags.tagNameToValueSetMap; JsonSmartHomeGroupIdentifiers.SmartHomeGroupIdentifier applianceGroupIdentifier = shg.applianceGroupIdentifier; - if (tagNameToValueSetMap != null && tagNameToValueSetMap.groupIdentity != null - && applianceGroupIdentifier != null && applianceGroupIdentifier.value != null - && Arrays.asList(tagNameToValueSetMap.groupIdentity) - .contains(applianceGroupIdentifier.value)) { - SmartHomeCapability[] capabilities = shd.capabilities; - if (capabilities != null) { - if (Arrays.stream(capabilities).map(capability -> capability.interfaceName) + if (tagNameToValueSetMap != null) { + List groupIdentity = Objects.requireNonNullElse(tagNameToValueSetMap.groupIdentity, + List.of()); + if (applianceGroupIdentifier != null && applianceGroupIdentifier.value != null + && groupIdentity.contains(applianceGroupIdentifier.value)) { + if (shd.getCapabilities().stream().map(capability -> capability.interfaceName) .anyMatch(SUPPORTED_INTERFACES::contains)) { result.add(shd); } diff --git a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonActivities.java b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonActivities.java index 0ad4f236310..c4cb88d9046 100644 --- a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonActivities.java +++ b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonActivities.java @@ -12,6 +12,9 @@ */ package org.openhab.binding.amazonechocontrol.internal.jsons; +import java.util.List; +import java.util.Objects; + import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.jdt.annotation.Nullable; @@ -26,7 +29,7 @@ import com.google.gson.JsonSyntaxException; @NonNullByDefault public class JsonActivities { - public @Nullable Activity @Nullable [] activities; + public @Nullable List activities; public static class Activity { public @Nullable String activityStatus; @@ -40,10 +43,14 @@ public class JsonActivities { public @Nullable String providerInfoDescription; public @Nullable String registeredCustomerId; public @Nullable Object sourceActiveUsers; - public @Nullable SourceDeviceId @Nullable [] sourceDeviceIds; + public @Nullable List sourceDeviceIds; public @Nullable String utteranceId; public @Nullable Long version; + public List getSourceDeviceIds() { + return Objects.requireNonNullElse(sourceDeviceIds, List.of()); + } + public static class SourceDeviceId { public @Nullable String deviceAccountId; public @Nullable String deviceType; @@ -51,7 +58,6 @@ public class JsonActivities { } public static class Description { - public @Nullable String summary; public @Nullable String firstUtteranceId; public @Nullable String firstStreamId; diff --git a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonAscendingAlarm.java b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonAscendingAlarm.java index 0ff74be87ff..265678b9340 100644 --- a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonAscendingAlarm.java +++ b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonAscendingAlarm.java @@ -12,6 +12,8 @@ */ package org.openhab.binding.amazonechocontrol.internal.jsons; +import java.util.List; + import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.jdt.annotation.Nullable; @@ -23,7 +25,7 @@ import org.eclipse.jdt.annotation.Nullable; @NonNullByDefault public class JsonAscendingAlarm { - public @Nullable AscendingAlarmModel @Nullable [] ascendingAlarmModelList; + public @Nullable List ascendingAlarmModelList; public static class AscendingAlarmModel { public @Nullable Boolean ascendingAlarmEnabled; diff --git a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonAutomation.java b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonAutomation.java index cb8f29167d8..02c3b92db41 100644 --- a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonAutomation.java +++ b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonAutomation.java @@ -12,6 +12,7 @@ */ package org.openhab.binding.amazonechocontrol.internal.jsons; +import java.util.List; import java.util.TreeMap; import org.eclipse.jdt.annotation.NonNullByDefault; @@ -26,7 +27,7 @@ import org.eclipse.jdt.annotation.Nullable; public class JsonAutomation { public @Nullable String automationId; public @Nullable String name; - public @Nullable Trigger @Nullable [] triggers; + public @Nullable List triggers; public @Nullable TreeMap sequence; public @Nullable String status; public long creationTimeEpochMillis; diff --git a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonBluetoothStates.java b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonBluetoothStates.java index 9d41e6032d9..d6007d27d00 100644 --- a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonBluetoothStates.java +++ b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonBluetoothStates.java @@ -12,6 +12,7 @@ */ package org.openhab.binding.amazonechocontrol.internal.jsons; +import java.util.List; import java.util.Objects; import org.eclipse.jdt.annotation.NonNullByDefault; @@ -50,7 +51,7 @@ public class JsonBluetoothStates { public boolean connected; public @Nullable String deviceClass; public @Nullable String friendlyName; - public @Nullable String @Nullable [] profiles; + public @Nullable List profiles; } public static class BluetoothState { @@ -59,6 +60,10 @@ public class JsonBluetoothStates { public @Nullable String friendlyName; public boolean gadgetPaired; public boolean online; - public @Nullable PairedDevice @Nullable [] pairedDeviceList; + public @Nullable List pairedDeviceList; + + public List getPairedDeviceList() { + return Objects.requireNonNullElse(pairedDeviceList, List.of()); + } } } diff --git a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonDeviceNotificationState.java b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonDeviceNotificationState.java index 07c15a27ddd..87ff2649f2c 100644 --- a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonDeviceNotificationState.java +++ b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonDeviceNotificationState.java @@ -12,6 +12,8 @@ */ package org.openhab.binding.amazonechocontrol.internal.jsons; +import java.util.List; + import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.jdt.annotation.Nullable; @@ -23,7 +25,7 @@ import org.eclipse.jdt.annotation.Nullable; @NonNullByDefault public class JsonDeviceNotificationState { - public @Nullable DeviceNotificationState @Nullable [] deviceNotificationStates; + public @Nullable List deviceNotificationStates; public static class DeviceNotificationState { public @Nullable String deviceSerialNumber; diff --git a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonDevices.java b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonDevices.java index 332854a3224..96353c06c2b 100644 --- a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonDevices.java +++ b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonDevices.java @@ -12,8 +12,9 @@ */ package org.openhab.binding.amazonechocontrol.internal.jsons; -import java.util.Arrays; import java.util.List; +import java.util.Objects; +import java.util.Set; import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.jdt.annotation.Nullable; @@ -35,7 +36,11 @@ public class JsonDevices { public @Nullable String deviceType; public @Nullable String softwareVersion; public boolean online; - public @Nullable String @Nullable [] capabilities; + public @Nullable Set capabilities; + + public Set getCapabilities() { + return Objects.requireNonNullElse(capabilities, Set.of()); + } @Override public String toString() { @@ -43,7 +48,7 @@ public class JsonDevices { + ", deviceOwnerCustomerId='" + deviceOwnerCustomerId + '\'' + ", deviceAccountId='" + deviceAccountId + '\'' + ", deviceFamily='" + deviceFamily + '\'' + ", deviceType='" + deviceType + '\'' + ", softwareVersion='" + softwareVersion + '\'' + ", online=" + online + ", capabilities=" - + Arrays.toString(capabilities) + '}'; + + capabilities + '}'; } } diff --git a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonEnabledFeeds.java b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonEnabledFeeds.java index 0807f15aef7..5f21bb03e59 100644 --- a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonEnabledFeeds.java +++ b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonEnabledFeeds.java @@ -12,6 +12,8 @@ */ package org.openhab.binding.amazonechocontrol.internal.jsons; +import java.util.List; + import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.jdt.annotation.Nullable; @@ -22,5 +24,5 @@ import org.eclipse.jdt.annotation.Nullable; */ @NonNullByDefault public class JsonEnabledFeeds { - public @Nullable JsonFeed @Nullable [] enabledFeeds; + public @Nullable List enabledFeeds; } diff --git a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonEqualizer.java b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonEqualizer.java index 405a2c585af..f69e6a2e586 100644 --- a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonEqualizer.java +++ b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonEqualizer.java @@ -16,7 +16,7 @@ import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.jdt.annotation.Nullable; /** - * The {@link JsonActivity} encapsulate the GSON data of the get equalizer command + * The {@link JsonEqualizer} encapsulate the GSON data of the get equalizer command * * @author Michael Geramb - Initial contribution */ diff --git a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonFeed.java b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonFeed.java index 55b273662df..d99abfbdf45 100644 --- a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonFeed.java +++ b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonFeed.java @@ -26,4 +26,9 @@ public class JsonFeed { public @Nullable String name; public @Nullable String skillId; public @Nullable String imageUrl; + + public JsonFeed(@Nullable Object feedId, @Nullable String skillId) { + this.feedId = feedId; + this.skillId = skillId; + } } diff --git a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonMediaState.java b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonMediaState.java index 4bbe4a38e06..bd6aaca5416 100644 --- a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonMediaState.java +++ b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonMediaState.java @@ -12,6 +12,8 @@ */ package org.openhab.binding.amazonechocontrol.internal.jsons; +import java.util.List; + import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.jdt.annotation.Nullable; @@ -36,7 +38,7 @@ public class JsonMediaState { public @Nullable String programId; public int progressSeconds; public @Nullable String providerId; - public @Nullable QueueEntry @Nullable [] queue; + public @Nullable List queue; public @Nullable String queueId; public @Nullable Integer queueSize; public @Nullable String radioStationId; @@ -48,7 +50,6 @@ public class JsonMediaState { public int volume; public static class QueueEntry { - public @Nullable String album; public @Nullable String albumAsin; public @Nullable String artist; diff --git a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonMusicProvider.java b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonMusicProvider.java index 99ee115c642..08ce275b16e 100644 --- a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonMusicProvider.java +++ b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonMusicProvider.java @@ -25,7 +25,7 @@ import org.eclipse.jdt.annotation.Nullable; @NonNullByDefault public class JsonMusicProvider { public @Nullable String displayName; - public @Nullable List @Nullable [] supportedTriggers; + public List @Nullable [] supportedTriggers; public @Nullable String icon; public @Nullable List supportedProperties; public @Nullable String id; diff --git a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonNotificationSounds.java b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonNotificationSounds.java index e872c53bce3..2cdeb84e544 100644 --- a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonNotificationSounds.java +++ b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonNotificationSounds.java @@ -12,6 +12,8 @@ */ package org.openhab.binding.amazonechocontrol.internal.jsons; +import java.util.List; + import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.jdt.annotation.Nullable; @@ -22,5 +24,5 @@ import org.eclipse.jdt.annotation.Nullable; */ @NonNullByDefault public class JsonNotificationSounds { - public @Nullable JsonNotificationSound @Nullable [] notificationSounds; + public @Nullable List notificationSounds; } diff --git a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonNotificationsResponse.java b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonNotificationsResponse.java index 5038c417d58..60c7405e26e 100644 --- a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonNotificationsResponse.java +++ b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonNotificationsResponse.java @@ -12,6 +12,8 @@ */ package org.openhab.binding.amazonechocontrol.internal.jsons; +import java.util.List; + import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.jdt.annotation.Nullable; @@ -22,5 +24,5 @@ import org.eclipse.jdt.annotation.Nullable; */ @NonNullByDefault public class JsonNotificationsResponse { - public JsonNotificationResponse @Nullable [] notifications; + public @Nullable List notifications; } diff --git a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonRegisterAppRequest.java b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonRegisterAppRequest.java index 6d516fa51eb..6573841a55c 100644 --- a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonRegisterAppRequest.java +++ b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonRegisterAppRequest.java @@ -12,6 +12,8 @@ */ package org.openhab.binding.amazonechocontrol.internal.jsons; +import java.util.List; + import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.jdt.annotation.Nullable; @@ -26,7 +28,7 @@ import com.google.gson.annotations.SerializedName; public class JsonRegisterAppRequest { public JsonRegisterAppRequest(String serial, @Nullable String accessToken, String frc, - JsonWebSiteCookie[] webSiteCookies) { + List webSiteCookies) { registrationData.deviceSerial = serial; authData.accessToken = accessToken; userContextMap.frc = frc; @@ -48,7 +50,7 @@ public class JsonRegisterAppRequest { public static class Cookies { @SerializedName("website_cookies") - public @Nullable JsonWebSiteCookie @Nullable [] webSiteCookies; + public List webSiteCookies = List.of(); public @Nullable String domain = ".amazon.com"; } diff --git a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonSmartHomeCapabilities.java b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonSmartHomeCapabilities.java index 2349796a3a2..baaafeb26db 100644 --- a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonSmartHomeCapabilities.java +++ b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonSmartHomeCapabilities.java @@ -12,6 +12,8 @@ */ package org.openhab.binding.amazonechocontrol.internal.jsons; +import java.util.List; + import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.jdt.annotation.Nullable; @@ -30,12 +32,12 @@ public class JsonSmartHomeCapabilities { } public static class Properties { - public @Nullable Property @Nullable [] supported; + public @Nullable List supported; } public static class Property { public @Nullable String name; } - public @Nullable SmartHomeCapability @Nullable [] capabilites; + public @Nullable List capabilites; } diff --git a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonSmartHomeDevices.java b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonSmartHomeDevices.java index 9e6bea857c6..b9167701aa4 100644 --- a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonSmartHomeDevices.java +++ b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonSmartHomeDevices.java @@ -12,8 +12,8 @@ */ package org.openhab.binding.amazonechocontrol.internal.jsons; -import java.util.Arrays; import java.util.List; +import java.util.Objects; import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.jdt.annotation.Nullable; @@ -28,6 +28,27 @@ import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeTags.Js public class JsonSmartHomeDevices { public static class SmartHomeDevice implements SmartHomeBaseDevice { public @Nullable Integer updateIntervalInSeconds; + public @Nullable String applianceId; + public @Nullable String manufacturerName; + public @Nullable String friendlyDescription; + public @Nullable String modelName; + public @Nullable String friendlyName; + public @Nullable String reachability; + public @Nullable String entityId; + public @Nullable SmartHomeDeviceNetworkState applianceNetworkState; + public @Nullable List capabilities; + public @Nullable JsonSmartHomeTag tags; + public @Nullable List applianceTypes; + public @Nullable List aliases; + public @Nullable List groupDevices; + public @Nullable String connectedVia; + public @Nullable DriverIdentity driverIdentity; + public @Nullable List mergedApplianceIds; + public @Nullable List smarthomeDevices; + + public List getCapabilities() { + return Objects.requireNonNullElse(capabilities, List.of()); + } @Override public @Nullable String findId() { @@ -39,34 +60,16 @@ public class JsonSmartHomeDevices { return false; } - public @Nullable String applianceId; - public @Nullable String manufacturerName; - public @Nullable String friendlyDescription; - public @Nullable String modelName; - public @Nullable String friendlyName; - public @Nullable String reachability; - public @Nullable String entityId; - public @Nullable SmartHomeDeviceNetworkState applianceNetworkState; - public @Nullable SmartHomeCapability @Nullable [] capabilities; - public @Nullable JsonSmartHomeTag tags; - public @Nullable String @Nullable [] applianceTypes; - public @Nullable JsonSmartHomeDeviceAlias @Nullable [] aliases; - public @Nullable SmartHomeDevice @Nullable [] groupDevices; - public @Nullable String connectedVia; - public @Nullable DriverIdentity driverIdentity; - public List mergedApplianceIds = List.of(); - @Override public String toString() { return "SmartHomeDevice{" + "updateIntervalInSeconds=" + updateIntervalInSeconds + ", applianceId='" + applianceId + '\'' + ", manufacturerName='" + manufacturerName + '\'' + ", friendlyDescription='" + friendlyDescription + '\'' + ", modelName='" + modelName + '\'' + ", friendlyName='" + friendlyName + '\'' + ", reachability='" + reachability + '\'' + ", entityId='" + entityId + '\'' - + ", applianceNetworkState=" + applianceNetworkState + ", capabilities=" - + Arrays.toString(capabilities) + ", tags=" + tags + ", applianceTypes=" - + Arrays.toString(applianceTypes) + ", aliases=" + Arrays.toString(aliases) + ", groupDevices=" - + Arrays.toString(groupDevices) + ", connectedVia='" + connectedVia + '\'' + ", driverIdentity=" - + driverIdentity + ", mergedApplianceIds=" + mergedApplianceIds + '}'; + + ", applianceNetworkState=" + applianceNetworkState + ", capabilities=" + capabilities + ", tags=" + + tags + ", applianceTypes=" + applianceTypes + ", aliases=" + aliases + ", groupDevices=" + + groupDevices + ", connectedVia='" + connectedVia + '\'' + ", driverIdentity=" + driverIdentity + + ", mergedApplianceIds=" + mergedApplianceIds + ", smarthomeDevices=" + smarthomeDevices + '}'; } } @@ -79,6 +82,4 @@ public class JsonSmartHomeDevices { return "DriverIdentity{" + "namespace='" + namespace + '\'' + ", identifier='" + identifier + '\'' + '}'; } } - - public @Nullable SmartHomeDevice @Nullable [] smarthomeDevices; } diff --git a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonSmartHomeGroupIdentity.java b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonSmartHomeGroupIdentity.java index 84ccf167d09..dda71557423 100644 --- a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonSmartHomeGroupIdentity.java +++ b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonSmartHomeGroupIdentity.java @@ -12,6 +12,8 @@ */ package org.openhab.binding.amazonechocontrol.internal.jsons; +import java.util.List; + import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.jdt.annotation.Nullable; @@ -23,8 +25,8 @@ import org.eclipse.jdt.annotation.Nullable; @NonNullByDefault public class JsonSmartHomeGroupIdentity { public static class SmartHomeGroupIdentity { - public @Nullable String @Nullable [] groupIdentity; + public @Nullable List groupIdentity; } - public @Nullable SmartHomeGroupIdentity @Nullable [] groupIdentity; + public @Nullable List groupIdentity; } diff --git a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonSmartHomeGroups.java b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonSmartHomeGroups.java index 2a016f3eecc..87fb8387185 100644 --- a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonSmartHomeGroups.java +++ b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonSmartHomeGroups.java @@ -12,6 +12,8 @@ */ package org.openhab.binding.amazonechocontrol.internal.jsons; +import java.util.List; + import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.jdt.annotation.Nullable; import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeGroupIdentifiers.SmartHomeGroupIdentifier; @@ -54,5 +56,5 @@ public class JsonSmartHomeGroups { } } - public @Nullable SmartHomeGroup @Nullable [] groups; + public @Nullable List groups; } diff --git a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonUsersMeResponse.java b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonUsersMeResponse.java index ac8e7e60865..003e0de351c 100644 --- a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonUsersMeResponse.java +++ b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonUsersMeResponse.java @@ -12,6 +12,8 @@ */ package org.openhab.binding.amazonechocontrol.internal.jsons; +import java.util.List; + import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.jdt.annotation.Nullable; @@ -26,7 +28,7 @@ public class JsonUsersMeResponse { public @Nullable String effectiveMarketPlaceId; public @Nullable String email; public @Nullable Boolean eulaAcceptance; - public @Nullable String @Nullable [] features; + public @Nullable List features; public @Nullable String fullName; public @Nullable Boolean hasActiveDopplers; public @Nullable String id; diff --git a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonWakeWords.java b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonWakeWords.java index a8fec6ed54d..e3c57b363ec 100644 --- a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonWakeWords.java +++ b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonWakeWords.java @@ -12,6 +12,8 @@ */ package org.openhab.binding.amazonechocontrol.internal.jsons; +import java.util.List; + import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.jdt.annotation.Nullable; @@ -22,7 +24,7 @@ import org.eclipse.jdt.annotation.Nullable; */ @NonNullByDefault public class JsonWakeWords { - public @Nullable WakeWord @Nullable [] wakeWords; + public @Nullable List wakeWords; public static class WakeWord { public @Nullable Boolean active; diff --git a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/smarthome/Constants.java b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/smarthome/Constants.java index e6bc6b6b49a..a5a35036893 100644 --- a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/smarthome/Constants.java +++ b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/smarthome/Constants.java @@ -12,13 +12,13 @@ */ package org.openhab.binding.amazonechocontrol.internal.smarthome; -import java.util.HashMap; import java.util.Map; import java.util.Set; -import java.util.function.Supplier; +import java.util.function.Function; import org.eclipse.jdt.annotation.NonNullByDefault; import org.openhab.binding.amazonechocontrol.internal.AmazonEchoControlBindingConstants; +import org.openhab.binding.amazonechocontrol.internal.handler.SmartHomeDeviceHandler; import org.openhab.core.thing.type.ChannelTypeUID; /** @@ -26,20 +26,15 @@ import org.openhab.core.thing.type.ChannelTypeUID; */ @NonNullByDefault public class Constants { - public static final Map> HANDLER_FACTORY = new HashMap<>(); - - static { - HANDLER_FACTORY.put(HandlerPowerController.INTERFACE, HandlerPowerController::new); - HANDLER_FACTORY.put(HandlerBrightnessController.INTERFACE, HandlerBrightnessController::new); - HANDLER_FACTORY.put(HandlerColorController.INTERFACE, HandlerColorController::new); - HANDLER_FACTORY.put(HandlerColorTemperatureController.INTERFACE, HandlerColorTemperatureController::new); - HANDLER_FACTORY.put(HandlerSecurityPanelController.INTERFACE, HandlerSecurityPanelController::new); - HANDLER_FACTORY.put(HandlerAcousticEventSensor.INTERFACE, HandlerAcousticEventSensor::new); - HANDLER_FACTORY.put(HandlerTemperatureSensor.INTERFACE, HandlerTemperatureSensor::new); - HANDLER_FACTORY.put(HandlerThermostatController.INTERFACE, HandlerThermostatController::new); - HANDLER_FACTORY.put(HandlerPercentageController.INTERFACE, HandlerPercentageController::new); - HANDLER_FACTORY.put(HandlerPowerLevelController.INTERFACE, HandlerPowerLevelController::new); - } + public static final Map> HANDLER_FACTORY = Map.of( + HandlerPowerController.INTERFACE, HandlerPowerController::new, HandlerBrightnessController.INTERFACE, + HandlerBrightnessController::new, HandlerColorController.INTERFACE, HandlerColorController::new, + HandlerColorTemperatureController.INTERFACE, HandlerColorTemperatureController::new, + HandlerSecurityPanelController.INTERFACE, HandlerSecurityPanelController::new, + HandlerAcousticEventSensor.INTERFACE, HandlerAcousticEventSensor::new, HandlerTemperatureSensor.INTERFACE, + HandlerTemperatureSensor::new, HandlerThermostatController.INTERFACE, HandlerThermostatController::new, + HandlerPercentageController.INTERFACE, HandlerPercentageController::new, + HandlerPowerLevelController.INTERFACE, HandlerPowerLevelController::new); public static final Set SUPPORTED_INTERFACES = HANDLER_FACTORY.keySet(); diff --git a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/smarthome/HandlerAcousticEventSensor.java b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/smarthome/HandlerAcousticEventSensor.java index e66f5276755..76a6b3f147e 100644 --- a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/smarthome/HandlerAcousticEventSensor.java +++ b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/smarthome/HandlerAcousticEventSensor.java @@ -22,6 +22,7 @@ import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.jdt.annotation.Nullable; import org.openhab.binding.amazonechocontrol.internal.AmazonEchoControlBindingConstants; import org.openhab.binding.amazonechocontrol.internal.Connection; +import org.openhab.binding.amazonechocontrol.internal.handler.SmartHomeDeviceHandler; import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeCapabilities.SmartHomeCapability; import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeDevices.SmartHomeDevice; import org.openhab.core.library.types.OpenClosedType; @@ -57,6 +58,10 @@ public class HandlerAcousticEventSensor extends HandlerBase { "smokeAlarmDetectionState" /* propertyName */ , "smokeAlarmDetectionState" /* ChannelId */, CHANNEL_TYPE_SMOKE_ALARM_DETECTION_STATE /* Channel Type */ , ITEM_TYPE_CONTACT /* Item Type */); + public HandlerAcousticEventSensor(SmartHomeDeviceHandler smartHomeDeviceHandler) { + super(smartHomeDeviceHandler); + } + private ChannelInfo[] getAlarmChannels() { return new ChannelInfo[] { GLASS_BREAK_DETECTION_STATE, SMOKE_ALARM_DETECTION_STATE }; } @@ -101,7 +106,7 @@ public class HandlerAcousticEventSensor extends HandlerBase { @Override public boolean handleCommand(Connection connection, SmartHomeDevice shd, String entityId, - SmartHomeCapability[] capabilties, String channelId, Command command) throws IOException { + List capabilities, String channelId, Command command) throws IOException { return false; } diff --git a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/smarthome/HandlerBase.java b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/smarthome/HandlerBase.java index a2648e048a6..7bd685fa556 100644 --- a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/smarthome/HandlerBase.java +++ b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/smarthome/HandlerBase.java @@ -13,16 +13,13 @@ package org.openhab.binding.amazonechocontrol.internal.smarthome; import java.io.IOException; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Locale; -import java.util.Map; +import java.util.*; import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.jdt.annotation.Nullable; import org.openhab.binding.amazonechocontrol.internal.Connection; import org.openhab.binding.amazonechocontrol.internal.handler.SmartHomeDeviceHandler; +import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeCapabilities; import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeCapabilities.Properties; import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeCapabilities.Property; import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeCapabilities.SmartHomeCapability; @@ -39,15 +36,19 @@ import com.google.gson.JsonObject; */ @NonNullByDefault public abstract class HandlerBase { - protected @Nullable SmartHomeDeviceHandler smartHomeDeviceHandler; + protected SmartHomeDeviceHandler smartHomeDeviceHandler; protected Map channels = new HashMap<>(); + public HandlerBase(SmartHomeDeviceHandler smartHomeDeviceHandler) { + this.smartHomeDeviceHandler = smartHomeDeviceHandler; + } + protected abstract ChannelInfo @Nullable [] findChannelInfos(SmartHomeCapability capability, String property); public abstract void updateChannels(String interfaceName, List stateList, UpdateChannelResult result); public abstract boolean handleCommand(Connection connection, SmartHomeDevice shd, String entityId, - SmartHomeCapability[] capabilties, String channelId, Command command) + List capabilities, String channelId, Command command) throws IOException, InterruptedException; public abstract @Nullable StateDescription findStateDescription(String channelId, @@ -59,38 +60,30 @@ public abstract class HandlerBase { public abstract String[] getSupportedInterface(); - SmartHomeDeviceHandler getSmartHomeDeviceHandler() throws IllegalStateException { - SmartHomeDeviceHandler smartHomeDeviceHandler = this.smartHomeDeviceHandler; - if (smartHomeDeviceHandler == null) { - throw new IllegalStateException("Handler not initialized"); - } + SmartHomeDeviceHandler getSmartHomeDeviceHandler() { return smartHomeDeviceHandler; } - public Collection initialize(SmartHomeDeviceHandler smartHomeDeviceHandler, - List capabilities) { - this.smartHomeDeviceHandler = smartHomeDeviceHandler; + public Collection initialize(List capabilities) { Map channels = new HashMap<>(); for (SmartHomeCapability capability : capabilities) { Properties properties = capability.properties; if (properties != null) { - Property @Nullable [] supported = properties.supported; - if (supported != null) { - for (Property property : supported) { - if (property != null) { - String name = property.name; - if (name != null) { - ChannelInfo[] channelInfos = findChannelInfos(capability, name); - if (channelInfos != null) { - for (ChannelInfo channelInfo : channelInfos) { - if (channelInfo != null) { - channels.put(channelInfo.channelId, channelInfo); - } - } + List supported = Objects.requireNonNullElse(properties.supported, + List.of()); + for (Property property : supported) { + String name = property.name; + if (name != null) { + ChannelInfo[] channelInfos = findChannelInfos(capability, name); + if (channelInfos != null) { + for (ChannelInfo channelInfo : channelInfos) { + if (channelInfo != null) { + channels.put(channelInfo.channelId, channelInfo); } } } } + } } } @@ -98,19 +91,14 @@ public abstract class HandlerBase { return channels.values(); } - protected boolean containsCapabilityProperty(SmartHomeCapability[] capabilties, String propertyName) { - for (SmartHomeCapability capability : capabilties) { + protected boolean containsCapabilityProperty(List capabilities, String propertyName) { + for (SmartHomeCapability capability : capabilities) { Properties properties = capability.properties; if (properties != null) { - Property @Nullable [] supportedProperties = properties.supported; - if (supportedProperties != null) { - for (Property property : supportedProperties) { - if (property != null) { - if (propertyName != null && propertyName.equals(property.name)) { - return true; - } - } - } + List supported = Objects.requireNonNullElse(properties.supported, + List.of()); + if (supported.stream().anyMatch(p -> propertyName.equals(p.name))) { + return true; } } } diff --git a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/smarthome/HandlerBrightnessController.java b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/smarthome/HandlerBrightnessController.java index 8e16bb8e55c..096fb1ec484 100644 --- a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/smarthome/HandlerBrightnessController.java +++ b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/smarthome/HandlerBrightnessController.java @@ -22,6 +22,7 @@ import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.jdt.annotation.Nullable; import org.openhab.binding.amazonechocontrol.internal.AmazonEchoControlBindingConstants; import org.openhab.binding.amazonechocontrol.internal.Connection; +import org.openhab.binding.amazonechocontrol.internal.handler.SmartHomeDeviceHandler; import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeCapabilities.SmartHomeCapability; import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeDevices.SmartHomeDevice; import org.openhab.core.library.types.IncreaseDecreaseType; @@ -56,6 +57,10 @@ public class HandlerBrightnessController extends HandlerBase { private @Nullable Integer lastBrightness; + public HandlerBrightnessController(SmartHomeDeviceHandler smartHomeDeviceHandler) { + super(smartHomeDeviceHandler); + } + @Override public String[] getSupportedInterface() { return new String[] { INTERFACE }; @@ -91,10 +96,10 @@ public class HandlerBrightnessController extends HandlerBase { @Override public boolean handleCommand(Connection connection, SmartHomeDevice shd, String entityId, - SmartHomeCapability[] capabilties, String channelId, Command command) + List capabilities, String channelId, Command command) throws IOException, InterruptedException { if (channelId.equals(BRIGHTNESS.channelId)) { - if (containsCapabilityProperty(capabilties, BRIGHTNESS.propertyName)) { + if (containsCapabilityProperty(capabilities, BRIGHTNESS.propertyName)) { if (command.equals(IncreaseDecreaseType.INCREASE)) { Integer lastBrightness = this.lastBrightness; if (lastBrightness != null) { diff --git a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/smarthome/HandlerColorController.java b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/smarthome/HandlerColorController.java index 8e462fd24fb..d4ff785440a 100644 --- a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/smarthome/HandlerColorController.java +++ b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/smarthome/HandlerColorController.java @@ -23,6 +23,7 @@ import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.jdt.annotation.Nullable; import org.openhab.binding.amazonechocontrol.internal.AmazonEchoControlBindingConstants; import org.openhab.binding.amazonechocontrol.internal.Connection; +import org.openhab.binding.amazonechocontrol.internal.handler.SmartHomeDeviceHandler; import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeCapabilities.SmartHomeCapability; import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeDevices.SmartHomeDevice; import org.openhab.core.library.types.DecimalType; @@ -65,6 +66,10 @@ public class HandlerColorController extends HandlerBase { private @Nullable HSBType lastColor; private @Nullable String lastColorName; + public HandlerColorController(SmartHomeDeviceHandler smartHomeDeviceHandler) { + super(smartHomeDeviceHandler); + } + @Override public String[] getSupportedInterface() { return new String[] { INTERFACE, INTERFACE_COLOR_PROPERTIES }; @@ -123,10 +128,10 @@ public class HandlerColorController extends HandlerBase { @Override public boolean handleCommand(Connection connection, SmartHomeDevice shd, String entityId, - SmartHomeCapability[] capabilties, String channelId, Command command) + List capabilities, String channelId, Command command) throws IOException, InterruptedException { if (channelId.equals(COLOR.channelId)) { - if (containsCapabilityProperty(capabilties, COLOR.propertyName)) { + if (containsCapabilityProperty(capabilities, COLOR.propertyName)) { if (command instanceof HSBType) { HSBType color = ((HSBType) command); JsonObject colorObject = new JsonObject(); @@ -138,7 +143,7 @@ public class HandlerColorController extends HandlerBase { } } if (channelId.equals(COLOR_PROPERTIES.channelId)) { - if (containsCapabilityProperty(capabilties, COLOR.propertyName)) { + if (containsCapabilityProperty(capabilities, COLOR.propertyName)) { if (command instanceof StringType) { String colorName = command.toFullString(); if (!colorName.isEmpty()) { diff --git a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/smarthome/HandlerColorTemperatureController.java b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/smarthome/HandlerColorTemperatureController.java index 0de442d3dea..bf763d1d9b2 100644 --- a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/smarthome/HandlerColorTemperatureController.java +++ b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/smarthome/HandlerColorTemperatureController.java @@ -23,6 +23,7 @@ import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.jdt.annotation.Nullable; import org.openhab.binding.amazonechocontrol.internal.AmazonEchoControlBindingConstants; import org.openhab.binding.amazonechocontrol.internal.Connection; +import org.openhab.binding.amazonechocontrol.internal.handler.SmartHomeDeviceHandler; import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeCapabilities.SmartHomeCapability; import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeDevices.SmartHomeDevice; import org.openhab.core.library.types.DecimalType; @@ -65,6 +66,10 @@ public class HandlerColorTemperatureController extends HandlerBase { private @Nullable Integer lastColorTemperature; private @Nullable String lastColorName; + public HandlerColorTemperatureController(SmartHomeDeviceHandler smartHomeDeviceHandler) { + super(smartHomeDeviceHandler); + } + @Override public String[] getSupportedInterface() { return new String[] { INTERFACE, INTERFACE_COLOR_PROPERTIES }; @@ -120,11 +125,11 @@ public class HandlerColorTemperatureController extends HandlerBase { @Override public boolean handleCommand(Connection connection, SmartHomeDevice shd, String entityId, - SmartHomeCapability[] capabilties, String channelId, Command command) + List capabilities, String channelId, Command command) throws IOException, InterruptedException { if (channelId.equals(COLOR_TEMPERATURE_IN_KELVIN.channelId)) { // WRITING TO THIS CHANNEL DOES CURRENTLY NOT WORK, BUT WE LEAVE THE CODE FOR FUTURE USE! - if (containsCapabilityProperty(capabilties, COLOR_TEMPERATURE_IN_KELVIN.propertyName)) { + if (containsCapabilityProperty(capabilities, COLOR_TEMPERATURE_IN_KELVIN.propertyName)) { if (command instanceof DecimalType) { int intValue = ((DecimalType) command).intValue(); if (intValue < 1000) { @@ -139,7 +144,7 @@ public class HandlerColorTemperatureController extends HandlerBase { } } if (channelId.equals(COLOR_TEMPERATURE_NAME.channelId)) { - if (containsCapabilityProperty(capabilties, COLOR_TEMPERATURE_IN_KELVIN.propertyName)) { + if (containsCapabilityProperty(capabilities, COLOR_TEMPERATURE_IN_KELVIN.propertyName)) { if (command instanceof StringType) { String colorTemperatureName = command.toFullString(); if (!colorTemperatureName.isEmpty()) { diff --git a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/smarthome/HandlerPercentageController.java b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/smarthome/HandlerPercentageController.java index fee62032ba1..6d2943472f7 100644 --- a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/smarthome/HandlerPercentageController.java +++ b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/smarthome/HandlerPercentageController.java @@ -22,6 +22,7 @@ import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.jdt.annotation.Nullable; import org.openhab.binding.amazonechocontrol.internal.AmazonEchoControlBindingConstants; import org.openhab.binding.amazonechocontrol.internal.Connection; +import org.openhab.binding.amazonechocontrol.internal.handler.SmartHomeDeviceHandler; import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeCapabilities.SmartHomeCapability; import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeDevices.SmartHomeDevice; import org.openhab.core.library.types.IncreaseDecreaseType; @@ -56,6 +57,10 @@ public class HandlerPercentageController extends HandlerBase { private @Nullable Integer lastPercentage; + public HandlerPercentageController(SmartHomeDeviceHandler smartHomeDeviceHandler) { + super(smartHomeDeviceHandler); + } + @Override public String[] getSupportedInterface() { return new String[] { INTERFACE }; @@ -91,10 +96,10 @@ public class HandlerPercentageController extends HandlerBase { @Override public boolean handleCommand(Connection connection, SmartHomeDevice shd, String entityId, - SmartHomeCapability[] capabilties, String channelId, Command command) + List capabilities, String channelId, Command command) throws IOException, InterruptedException { if (channelId.equals(PERCENTAGE.channelId)) { - if (containsCapabilityProperty(capabilties, PERCENTAGE.propertyName)) { + if (containsCapabilityProperty(capabilities, PERCENTAGE.propertyName)) { if (command.equals(IncreaseDecreaseType.INCREASE)) { Integer lastPercentage = this.lastPercentage; if (lastPercentage != null) { diff --git a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/smarthome/HandlerPowerController.java b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/smarthome/HandlerPowerController.java index 1c63fcea010..255625a828f 100644 --- a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/smarthome/HandlerPowerController.java +++ b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/smarthome/HandlerPowerController.java @@ -22,6 +22,7 @@ import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.jdt.annotation.Nullable; import org.openhab.binding.amazonechocontrol.internal.AmazonEchoControlBindingConstants; import org.openhab.binding.amazonechocontrol.internal.Connection; +import org.openhab.binding.amazonechocontrol.internal.handler.SmartHomeDeviceHandler; import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeCapabilities.SmartHomeCapability; import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeDevices.SmartHomeDevice; import org.openhab.core.library.types.OnOffType; @@ -56,6 +57,10 @@ public class HandlerPowerController extends HandlerBase { "powerState" /* ChannelId */, CHANNEL_TYPE_POWER_STATE /* Channel Type */ , ITEM_TYPE_SWITCH /* Item Type */); + public HandlerPowerController(SmartHomeDeviceHandler smartHomeDeviceHandler) { + super(smartHomeDeviceHandler); + } + @Override public String[] getSupportedInterface() { return new String[] { INTERFACE }; @@ -77,12 +82,7 @@ public class HandlerPowerController extends HandlerBase { if (POWER_STATE.propertyName.equals(state.get("name").getAsString())) { String value = state.get("value").getAsString(); // For groups take true if all true - if ("ON".equals(value)) { - powerStateValue = true; - } else { - powerStateValue = false; - } - + powerStateValue = "ON".equals(value); } } logger.trace("{} final state {}", this.smartHomeDeviceHandler.getId(), powerStateValue); @@ -91,7 +91,7 @@ public class HandlerPowerController extends HandlerBase { @Override public boolean handleCommand(Connection connection, SmartHomeDevice shd, String entityId, - SmartHomeCapability[] capabilities, String channelId, Command command) + List capabilities, String channelId, Command command) throws IOException, InterruptedException { if (channelId.equals(POWER_STATE.channelId)) { if (containsCapabilityProperty(capabilities, POWER_STATE.propertyName)) { diff --git a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/smarthome/HandlerPowerLevelController.java b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/smarthome/HandlerPowerLevelController.java index 2fb7be06efd..141e039e16e 100644 --- a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/smarthome/HandlerPowerLevelController.java +++ b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/smarthome/HandlerPowerLevelController.java @@ -22,6 +22,7 @@ import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.jdt.annotation.Nullable; import org.openhab.binding.amazonechocontrol.internal.AmazonEchoControlBindingConstants; import org.openhab.binding.amazonechocontrol.internal.Connection; +import org.openhab.binding.amazonechocontrol.internal.handler.SmartHomeDeviceHandler; import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeCapabilities.SmartHomeCapability; import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeDevices.SmartHomeDevice; import org.openhab.core.library.types.IncreaseDecreaseType; @@ -56,6 +57,10 @@ public class HandlerPowerLevelController extends HandlerBase { private @Nullable Integer lastPowerLevel; + public HandlerPowerLevelController(SmartHomeDeviceHandler smartHomeDeviceHandler) { + super(smartHomeDeviceHandler); + } + @Override public String[] getSupportedInterface() { return new String[] { INTERFACE }; @@ -92,10 +97,10 @@ public class HandlerPowerLevelController extends HandlerBase { @Override public boolean handleCommand(Connection connection, SmartHomeDevice shd, String entityId, - SmartHomeCapability[] capabilties, String channelId, Command command) + List capabilities, String channelId, Command command) throws IOException, InterruptedException { if (channelId.equals(POWER_LEVEL.channelId)) { - if (containsCapabilityProperty(capabilties, POWER_LEVEL.propertyName)) { + if (containsCapabilityProperty(capabilities, POWER_LEVEL.propertyName)) { if (command.equals(IncreaseDecreaseType.INCREASE)) { Integer lastPowerLevel = this.lastPowerLevel; if (lastPowerLevel != null) { diff --git a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/smarthome/HandlerSecurityPanelController.java b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/smarthome/HandlerSecurityPanelController.java index c9354762de6..a2e743d8d5a 100644 --- a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/smarthome/HandlerSecurityPanelController.java +++ b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/smarthome/HandlerSecurityPanelController.java @@ -23,6 +23,7 @@ import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.jdt.annotation.Nullable; import org.openhab.binding.amazonechocontrol.internal.AmazonEchoControlBindingConstants; import org.openhab.binding.amazonechocontrol.internal.Connection; +import org.openhab.binding.amazonechocontrol.internal.handler.SmartHomeDeviceHandler; import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeCapabilities.SmartHomeCapability; import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeDevices.SmartHomeDevice; import org.openhab.core.library.types.OpenClosedType; @@ -81,6 +82,10 @@ public class HandlerSecurityPanelController extends HandlerBase { "waterAlarm" /* ChannelId */, CHANNEL_TYPE_WATER_ALARM /* Channel Type */ , ITEM_TYPE_CONTACT /* Item Type */); + public HandlerSecurityPanelController(SmartHomeDeviceHandler smartHomeDeviceHandler) { + super(smartHomeDeviceHandler); + } + private ChannelInfo[] getAlarmChannels() { return new ChannelInfo[] { BURGLARY_ALARM, CARBON_MONOXIDE_ALARM, FIRE_ALARM, WATER_ALARM }; } @@ -146,7 +151,7 @@ public class HandlerSecurityPanelController extends HandlerBase { @Override public boolean handleCommand(Connection connection, SmartHomeDevice shd, String entityId, - SmartHomeCapability[] capabilities, String channelId, Command command) + List capabilities, String channelId, Command command) throws IOException, InterruptedException { if (channelId.equals(ARM_STATE.channelId)) { if (containsCapabilityProperty(capabilities, ARM_STATE.propertyName)) { diff --git a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/smarthome/HandlerTemperatureSensor.java b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/smarthome/HandlerTemperatureSensor.java index b7722c7de42..622a8dc8a12 100644 --- a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/smarthome/HandlerTemperatureSensor.java +++ b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/smarthome/HandlerTemperatureSensor.java @@ -23,6 +23,7 @@ import javax.measure.quantity.Temperature; import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.jdt.annotation.Nullable; import org.openhab.binding.amazonechocontrol.internal.Connection; +import org.openhab.binding.amazonechocontrol.internal.handler.SmartHomeDeviceHandler; import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeCapabilities.SmartHomeCapability; import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeDevices.SmartHomeDevice; import org.openhab.core.library.types.QuantityType; @@ -49,6 +50,10 @@ public class HandlerTemperatureSensor extends HandlerBase { "temperature" /* ChannelId */, CHANNEL_TYPE_TEMPERATURE /* Channel Type */ , ITEM_TYPE_NUMBER_TEMPERATURE /* Item Type */); + public HandlerTemperatureSensor(SmartHomeDeviceHandler smartHomeDeviceHandler) { + super(smartHomeDeviceHandler); + } + @Override public String[] getSupportedInterface() { return new String[] { INTERFACE }; @@ -85,7 +90,7 @@ public class HandlerTemperatureSensor extends HandlerBase { @Override public boolean handleCommand(Connection connection, SmartHomeDevice shd, String entityId, - SmartHomeCapability[] capabilties, String channelId, Command command) throws IOException { + List capabilities, String channelId, Command command) throws IOException { return false; } diff --git a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/smarthome/HandlerThermostatController.java b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/smarthome/HandlerThermostatController.java index 466818817ec..99a1924d366 100644 --- a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/smarthome/HandlerThermostatController.java +++ b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/smarthome/HandlerThermostatController.java @@ -23,6 +23,7 @@ import javax.measure.quantity.Temperature; import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.jdt.annotation.Nullable; import org.openhab.binding.amazonechocontrol.internal.Connection; +import org.openhab.binding.amazonechocontrol.internal.handler.SmartHomeDeviceHandler; import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeCapabilities.SmartHomeCapability; import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeDevices.SmartHomeDevice; import org.openhab.core.library.types.QuantityType; @@ -48,6 +49,10 @@ public class HandlerThermostatController extends HandlerBase { "targetSetpoint" /* ChannelId */, CHANNEL_TYPE_TEMPERATURE /* Channel Type */ , ITEM_TYPE_NUMBER_TEMPERATURE /* Item Type */); + public HandlerThermostatController(SmartHomeDeviceHandler smartHomeDeviceHandler) { + super(smartHomeDeviceHandler); + } + @Override public String[] getSupportedInterface() { return new String[] { INTERFACE }; @@ -84,10 +89,10 @@ public class HandlerThermostatController extends HandlerBase { @Override public boolean handleCommand(Connection connection, SmartHomeDevice shd, String entityId, - SmartHomeCapability[] capabilties, String channelId, Command command) + List capabilities, String channelId, Command command) throws IOException, InterruptedException { if (channelId.equals(TARGET_SETPOINT.channelId)) { - if (containsCapabilityProperty(capabilties, TARGET_SETPOINT.propertyName)) { + if (containsCapabilityProperty(capabilities, TARGET_SETPOINT.propertyName)) { if (command instanceof QuantityType) { connection.smartHomeCommand(entityId, "setTargetTemperature", "targetTemperature", command); return true; diff --git a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/smarthome/SmartHomeDeviceStateGroupUpdateCalculator.java b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/smarthome/SmartHomeDeviceStateGroupUpdateCalculator.java index 8cdebfe5848..3c989fbb690 100644 --- a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/smarthome/SmartHomeDeviceStateGroupUpdateCalculator.java +++ b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/smarthome/SmartHomeDeviceStateGroupUpdateCalculator.java @@ -20,7 +20,6 @@ import java.util.Map; import java.util.Set; import org.eclipse.jdt.annotation.NonNullByDefault; -import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeCapabilities.SmartHomeCapability; import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeDevices.DriverIdentity; import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeDevices.SmartHomeDevice; import org.slf4j.Logger; @@ -64,15 +63,11 @@ public class SmartHomeDeviceStateGroupUpdateCalculator { if (updateIntervalInSeconds != null) { return updateIntervalInSeconds; } - SmartHomeCapability[] capabilities = shd.capabilities; - if (capabilities != null) { - for (SmartHomeCapability capability : capabilities) { - if (capability != null && HandlerAcousticEventSensor.INTERFACE.equals(capability.interfaceName)) { - updateIntervalInSeconds = UPDATE_INTERVAL_ACOUSTIC_EVENTS_IN_SECONDS; - break; - } - } + if (shd.getCapabilities().stream() + .anyMatch(capability -> HandlerAcousticEventSensor.INTERFACE.equals(capability.interfaceName))) { + updateIntervalInSeconds = UPDATE_INTERVAL_ACOUSTIC_EVENTS_IN_SECONDS; } + if (updateIntervalInSeconds == null) { String manufacturerName = shd.manufacturerName; if (manufacturerName != null && ("openHAB".equalsIgnoreCase(manufacturerName)