From 3d2cefb44996cc80c88fa33cc99e07628b6b66be Mon Sep 17 00:00:00 2001 From: Diego Romar <18450339+doromaraujo@users.noreply.github.com> Date: Wed, 1 Oct 2025 15:20:17 -0300 Subject: [PATCH] Propagate exception when selecting / deselecting routes So that when toggling a route switch, it won't be in an inconsistent state in case of error from engine --- .../client/repository/VPNServiceRepository.java | 4 ++-- .../netbird/client/ui/home/NetworksAdapter.java | 15 +++++++++++++-- .../netbird/client/ui/home/NetworksFragment.java | 2 +- .../client/ui/home/NetworksFragmentViewModel.java | 4 ++-- .../java/io/netbird/client/tool/EngineRunner.java | 6 ++++-- .../java/io/netbird/client/tool/VPNService.java | 4 ++-- 6 files changed, 24 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/io/netbird/client/repository/VPNServiceRepository.java b/app/src/main/java/io/netbird/client/repository/VPNServiceRepository.java index 5953d3f..990ba7c 100644 --- a/app/src/main/java/io/netbird/client/repository/VPNServiceRepository.java +++ b/app/src/main/java/io/netbird/client/repository/VPNServiceRepository.java @@ -159,13 +159,13 @@ public class VPNServiceRepository { } } - public void selectRoute(String route) { + public void selectRoute(String route) throws Exception { if (binder != null) { binder.selectRoute(route); } } - public void deselectRoute(String route) { + public void deselectRoute(String route) throws Exception { if (binder != null) { binder.deselectRoute(route); } 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 2211813..e25a6eb 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 @@ -16,7 +16,7 @@ import io.netbird.client.databinding.ListItemResourceBinding; public class NetworksAdapter extends RecyclerView.Adapter { public interface RouteSwitchToggleHandler { - void handleSwitchToggle(String route, boolean isChecked); + void handleSwitchToggle(String route, boolean isChecked) throws Exception; } private final List resourcesList; @@ -145,8 +145,19 @@ public class NetworksAdapter extends RecyclerView.Adapter { - this.switchToggleHandler.handleSwitchToggle(resource.getName(), isChecked); + try { + boolean tag = (boolean)binding.switchControl.getTag(); + if (!tag) { + this.switchToggleHandler.handleSwitchToggle(resource.getName(), isChecked); + } + } catch (Exception ignored) { + // This is done so that reversing the toggle action won't retrigger the toggle handler. + binding.switchControl.setTag(true); + binding.switchControl.setChecked(!isChecked); + binding.switchControl.setTag(false); + } }); binding.verticalLine.setBackgroundResource(getConnectionStatusIndicatorDrawable(resource, peers)); diff --git a/app/src/main/java/io/netbird/client/ui/home/NetworksFragment.java b/app/src/main/java/io/netbird/client/ui/home/NetworksFragment.java index d47f9f4..46260af 100644 --- a/app/src/main/java/io/netbird/client/ui/home/NetworksFragment.java +++ b/app/src/main/java/io/netbird/client/ui/home/NetworksFragment.java @@ -107,7 +107,7 @@ public class NetworksFragment extends Fragment { ); } - private void routeSwitchToggleHandler(String route, boolean isChecked) { + private void routeSwitchToggleHandler(String route, boolean isChecked) throws Exception { if (isChecked) { model.selectRoute(route); } else { diff --git a/app/src/main/java/io/netbird/client/ui/home/NetworksFragmentViewModel.java b/app/src/main/java/io/netbird/client/ui/home/NetworksFragmentViewModel.java index 921b953..db5b79d 100644 --- a/app/src/main/java/io/netbird/client/ui/home/NetworksFragmentViewModel.java +++ b/app/src/main/java/io/netbird/client/ui/home/NetworksFragmentViewModel.java @@ -67,11 +67,11 @@ public class NetworksFragmentViewModel extends ViewModel implements VPNServiceBi uiState.postValue(new NetworksFragmentUiState(resources, peers)); } - public void selectRoute(String route) { + public void selectRoute(String route) throws Exception { this.repository.selectRoute(route); } - public void deselectRoute(String route) { + public void deselectRoute(String route) throws Exception { this.repository.deselectRoute(route); } } diff --git a/tool/src/main/java/io/netbird/client/tool/EngineRunner.java b/tool/src/main/java/io/netbird/client/tool/EngineRunner.java index e8ae15c..124ffee 100644 --- a/tool/src/main/java/io/netbird/client/tool/EngineRunner.java +++ b/tool/src/main/java/io/netbird/client/tool/EngineRunner.java @@ -168,23 +168,25 @@ class EngineRunner { } } - public void selectRoute(String route) { + public void selectRoute(String route) throws Exception { Log.d(LOGTAG, String.format("selecting route: %s", route)); try { goClient.selectRoute(route); } catch (Exception e) { Log.e(LOGTAG, "goClient error", e); notifyError(e); + throw e; } } - public void deselectRoute(String route) { + public void deselectRoute(String route) throws Exception { Log.d(LOGTAG, String.format("deselecting route: %s", route)); try { goClient.deselectRoute(route); } catch (Exception e) { Log.e(LOGTAG, "goClient error", e); notifyError(e); + throw e; } } } diff --git a/tool/src/main/java/io/netbird/client/tool/VPNService.java b/tool/src/main/java/io/netbird/client/tool/VPNService.java index 5f77d29..1639d8a 100644 --- a/tool/src/main/java/io/netbird/client/tool/VPNService.java +++ b/tool/src/main/java/io/netbird/client/tool/VPNService.java @@ -180,11 +180,11 @@ public class VPNService extends android.net.VpnService { } } - public void selectRoute(String route) { + public void selectRoute(String route) throws Exception { engineRunner.selectRoute(route); } - public void deselectRoute(String route) { + public void deselectRoute(String route) throws Exception { engineRunner.deselectRoute(route); } }