diff --git a/app/src/main/java/com/limelight/computers/ComputerManagerService.java b/app/src/main/java/com/limelight/computers/ComputerManagerService.java index 65de68a8..3ea3e625 100644 --- a/app/src/main/java/com/limelight/computers/ComputerManagerService.java +++ b/app/src/main/java/com/limelight/computers/ComputerManagerService.java @@ -588,8 +588,11 @@ public class ComputerManagerService extends Service { } } - // Save the old MAC address + // Save some details about the old state of the PC that we may wish + // to restore later. String savedMacAddress = details.macAddress; + String savedLocalAddress = details.localAddress; + String savedRemoteAddress = details.remoteAddress; // If we got here, it's reachable details.update(initialReachTuple.computer); @@ -600,6 +603,25 @@ public class ComputerManagerService extends Service { details.macAddress = savedMacAddress; } + // We never want to lose IP addresses by polling server info. If we get a poll back + // where localAddress == remoteAddress but savedLocalAddress != savedRemoteAddress, + // then we've lost an address in the polling and we should restore the one that's missing. + if (details.localAddress.equals(details.remoteAddress) && + !savedLocalAddress.equals(savedRemoteAddress)) { + if (details.localAddress.equals(savedLocalAddress)) { + // Local addresses are identical, so put the old remote address back + details.remoteAddress = savedRemoteAddress; + } + else if (details.remoteAddress.equals(savedRemoteAddress)) { + // Remote addresses are identical, so put the old local address back + details.localAddress = savedLocalAddress; + } + else { + // Neither IP address match. Let's restore the remote address to be safe. + details.remoteAddress = savedRemoteAddress; + } + } + return true; }