]> git.basschouten.com Git - openhab-addons.git/commitdiff
[androiddebugbridge] check device awake state and minor fixes (#10106)
authorGiviMAD <GiviMAD@users.noreply.github.com>
Tue, 9 Feb 2021 01:25:52 +0000 (17:25 -0800)
committerGitHub <noreply@github.com>
Tue, 9 Feb 2021 01:25:52 +0000 (17:25 -0800)
* check device awake state and minor fixes
* avoid update awake channel when not linked

Signed-off-by: Miguel <miguelwork92@gmail.com>
bundles/org.openhab.binding.androiddebugbridge/src/main/java/org/openhab/binding/androiddebugbridge/internal/AndroidDebugBridgeBindingConstants.java
bundles/org.openhab.binding.androiddebugbridge/src/main/java/org/openhab/binding/androiddebugbridge/internal/AndroidDebugBridgeDevice.java
bundles/org.openhab.binding.androiddebugbridge/src/main/java/org/openhab/binding/androiddebugbridge/internal/AndroidDebugBridgeHandler.java
bundles/org.openhab.binding.androiddebugbridge/src/main/resources/OH-INF/thing/thing-types.xml

index de2d31d64d9238927b35d55c70d95bea3c09d8d8..3e738d6a114fc638daf722208ced00f1ed9df236 100644 (file)
@@ -42,6 +42,7 @@ public class AndroidDebugBridgeBindingConstants {
     public static final String STOP_PACKAGE_CHANNEL = "stop-package";
     public static final String STOP_CURRENT_PACKAGE_CHANNEL = "stop-current-package";
     public static final String CURRENT_PACKAGE_CHANNEL = "current-package";
+    public static final String AWAKE_STATE_CHANNEL = "awake-state";
     public static final String WAKE_LOCK_CHANNEL = "wake-lock";
     public static final String SCREEN_STATE_CHANNEL = "screen-state";
     // List of all Parameters
index 8778fcfbbec420ec4a8c937707ca4fad60fe2e23..8bcdd58e76cc85b72ea5d3a6ee1af4ffa8074dac 100644 (file)
@@ -120,12 +120,19 @@ public class AndroidDebugBridgeDevice {
         throw new AndroidDebugBridgeDeviceReadException("can read package name");
     }
 
+    public boolean isAwake()
+            throws InterruptedException, AndroidDebugBridgeDeviceException, TimeoutException, ExecutionException {
+        String devicesResp = runAdbShell("dumpsys", "activity", "|", "grep", "mWakefulness");
+        return devicesResp.contains("mWakefulness=Awake");
+    }
+
     public boolean isScreenOn() throws InterruptedException, AndroidDebugBridgeDeviceException,
             AndroidDebugBridgeDeviceReadException, TimeoutException, ExecutionException {
         String devicesResp = runAdbShell("dumpsys", "power", "|", "grep", "'Display Power'");
         if (devicesResp.contains("=")) {
             try {
-                return devicesResp.split("=")[1].equals("ON");
+                var state = devicesResp.split("=")[1].trim();
+                return state.equals("ON");
             } catch (NumberFormatException e) {
                 logger.debug("Unable to parse device wake lock: {}", e.getMessage());
             }
index 245e38b90ca37c073a18d028b7b6a82feb0c783c..410e4887e4e196144f67effcb3c50e803db4a591 100644 (file)
@@ -59,6 +59,7 @@ public class AndroidDebugBridgeHandler extends BaseThingHandler {
     private AndroidDebugBridgeConfiguration config = new AndroidDebugBridgeConfiguration();
     private @Nullable ScheduledFuture<?> connectionCheckerSchedule;
     private AndroidDebugBridgeMediaStatePackageConfig @Nullable [] packageConfigs = null;
+    private boolean deviceAwake = false;
 
     public AndroidDebugBridgeHandler(Thing thing) {
         super(thing);
@@ -135,6 +136,12 @@ public class AndroidDebugBridgeHandler extends BaseThingHandler {
                     updateState(channelUID, new DecimalType(lock));
                 }
                 break;
+            case AWAKE_STATE_CHANNEL:
+                if (command instanceof RefreshType) {
+                    boolean awakeState = adbConnection.isAwake();
+                    updateState(channelUID, OnOffType.from(awakeState));
+                }
+                break;
             case SCREEN_STATE_CHANNEL:
                 if (command instanceof RefreshType) {
                     boolean screenState = adbConnection.isScreenOn();
@@ -277,6 +284,7 @@ public class AndroidDebugBridgeHandler extends BaseThingHandler {
                 } catch (AndroidDebugBridgeDeviceException e) {
                     logger.debug("Error connecting to device; [{}]: {}", e.getClass().getCanonicalName(),
                             e.getMessage());
+                    adbConnection.disconnect();
                     updateStatus(ThingStatus.OFFLINE);
                     return;
                 }
@@ -294,6 +302,23 @@ public class AndroidDebugBridgeHandler extends BaseThingHandler {
     }
 
     private void refreshStatus() throws InterruptedException, AndroidDebugBridgeDeviceException, ExecutionException {
+        boolean awakeState;
+        boolean prevDeviceAwake = deviceAwake;
+        try {
+            awakeState = adbConnection.isAwake();
+            deviceAwake = awakeState;
+        } catch (TimeoutException e) {
+            logger.warn("Unable to refresh awake state: Timeout");
+            return;
+        }
+        var awakeStateChannelUID = new ChannelUID(this.thing.getUID(), AWAKE_STATE_CHANNEL);
+        if (isLinked(awakeStateChannelUID)) {
+            updateState(awakeStateChannelUID, OnOffType.from(awakeState));
+        }
+        if (!awakeState && !prevDeviceAwake) {
+            logger.debug("device {} is sleeping", config.ip);
+            return;
+        }
         try {
             handleCommandInternal(new ChannelUID(this.thing.getUID(), MEDIA_VOLUME_CHANNEL), RefreshType.REFRESH);
         } catch (AndroidDebugBridgeDeviceReadException e) {
index 98710f5459c7440bf67475902f294aa843a5638b..77336ba900f9815840ef49b03262ff6900f4154b 100644 (file)
@@ -18,6 +18,7 @@
                        <channel id="current-package" typeId="current-package-channel"/>
                        <channel id="wake-lock" typeId="wake-lock-channel"/>
                        <channel id="screen-state" typeId="screen-state-channel"/>
+                       <channel id="awake-state" typeId="awake-state-channel"/>
                </channels>
                <representation-property>serial</representation-property>
                <config-description>
                <state readOnly="true"/>
        </channel-type>
 
+       <channel-type id="awake-state-channel" advanced="true">
+               <item-type>Switch</item-type>
+               <label>Awake State</label>
+               <description>Awake State</description>
+               <state readOnly="true"/>
+       </channel-type>
+
        <channel-type id="screen-state-channel" advanced="true">
                <item-type>Switch</item-type>
                <label>Screen State</label>