diff --git a/app/src/main/java/io/netbird/client/ui/home/NetworksAdapter.java b/app/src/main/java/io/netbird/client/ui/home/NetworksAdapter.java
index cb7d538..2211813 100644
--- a/app/src/main/java/io/netbird/client/ui/home/NetworksAdapter.java
+++ b/app/src/main/java/io/netbird/client/ui/home/NetworksAdapter.java
@@ -9,6 +9,7 @@ import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;
import java.util.List;
+import java.util.stream.Collectors;
import io.netbird.client.R;
import io.netbird.client.databinding.ListItemResourceBinding;
@@ -71,7 +72,7 @@ public class NetworksAdapter extends RecyclerView.Adapter temporaryList = new ArrayList<>(resourcesList);
for (Resource res : temporaryList) {
- if (res.getName().toLowerCase().contains(filterQueryString.toLowerCase())){
+ if (res.getName().toLowerCase().contains(filterQueryString.toLowerCase())) {
filteredResourcesList.add(res);
}
}
@@ -93,14 +94,46 @@ public class NetworksAdapter extends RecyclerView.Adapter
+ * Returns a drawable indicating whether a given resource is CONNECTED, SELECTED or DESELECTED.
+ * A resource is considered CONNECTED when, given a list of routing peers, at least one of them
+ * also has a CONNECTED status and contains a route that maps to that given resource's address
+ *
+ *
+ * OR
+ *
+ *
+ * if the resource is mapped to a domain whose any of its resolved IP addresses is contained
+ * in any of the CONNECTED routing peer's routes.
+ *
+ * Barring those conditions, it simply checks if the resource is selected or not.
+ *
+ */
@DrawableRes
private int getConnectionStatusIndicatorDrawable(Resource resource, List peers) {
var connectedPeers = peers.stream()
.filter(peer -> peer.getStatus().equals(Status.CONNECTED))
+ .collect(Collectors.toList());
+
+ var totalPeersWithRouteMatchingResourceAddress = connectedPeers.stream()
.filter(peer -> peer.getRoutes().contains(resource.getAddress()))
.count();
- if (connectedPeers > 0) return R.drawable.peer_status_connected;
+ if (totalPeersWithRouteMatchingResourceAddress > 0) {
+ return R.drawable.peer_status_connected;
+ }
+
+ var allResolvedIPAddresses = resource.getDomains().stream()
+ .flatMap(domain -> domain.getResolvedIPs().stream());
+
+ var allConnectedRoutingPeerRoutes = connectedPeers.stream()
+ .flatMap(peer -> peer.getRoutes().stream())
+ .collect(Collectors.toList());
+
+ if (allResolvedIPAddresses.anyMatch(allConnectedRoutingPeerRoutes::contains)) {
+ return R.drawable.peer_status_connected;
+ }
if (resource.isSelected()) return R.drawable.peer_status_selected;
return R.drawable.peer_status_disconnected;
@@ -118,7 +151,7 @@ public class NetworksAdapter extends RecyclerView.Adapter