From da213e03bbb371c402255b109d8107c8f6bfdb5a Mon Sep 17 00:00:00 2001 From: Diego Romar Date: Wed, 3 Sep 2025 16:34:48 -0300 Subject: [PATCH 01/21] Add instrumented tests for Preferences --- .../tool/PreferencesInstrumentedTest.java | 93 +++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 tool/src/androidTest/java/io/netbird/client/tool/PreferencesInstrumentedTest.java diff --git a/tool/src/androidTest/java/io/netbird/client/tool/PreferencesInstrumentedTest.java b/tool/src/androidTest/java/io/netbird/client/tool/PreferencesInstrumentedTest.java new file mode 100644 index 0000000..2e875e8 --- /dev/null +++ b/tool/src/androidTest/java/io/netbird/client/tool/PreferencesInstrumentedTest.java @@ -0,0 +1,93 @@ +package io.netbird.client.tool; + +import androidx.test.platform.app.InstrumentationRegistry; +import androidx.test.ext.junit.runners.AndroidJUnit4; + +import org.junit.After; +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; +import org.junit.runner.RunWith; + +import android.content.Context; + +@RunWith(AndroidJUnit4.class) +public class PreferencesInstrumentedTest { + private static Preferences preferences; + + private static Context getContext() { + return InstrumentationRegistry.getInstrumentation().getTargetContext(); + } + + @BeforeClass + public static void setUp() { + preferences = new Preferences(getContext()); + } + + @After + public void tearDown() { + getContext().getSharedPreferences("netbird", Context.MODE_PRIVATE).edit().clear().apply(); + } + + @Test + public void shouldCreatePreferencesWithoutThrownException() { + Preferences preferences = null; + Exception thrown = null; + + try { + preferences = new Preferences(getContext()); + } catch (Exception e) { + thrown = e; + } + + Assert.assertNull(thrown); + Assert.assertNotNull(preferences); + } + + @Test + public void shouldReturnFalseWhenRelayConnectionEnforcementIsNotSet() { + Assert.assertFalse(preferences.isRelayConnectionEnforced()); + } + + @Test + public void shouldReturnTrueAfterEnablingRelayConnectionEnforcement() { + preferences.enableRelayConnectionEnforcement(); + + Assert.assertTrue(preferences.isRelayConnectionEnforced()); + } + + @Test + public void shouldReturnFalseAfterDisablingRelayConnectionEnforcement() { + preferences.enableRelayConnectionEnforcement(); + preferences.disableRelayConnectionEnforcement(); + + Assert.assertFalse(preferences.isRelayConnectionEnforced()); + } + + @Test + public void shouldReturnFalseWhenTraceLogIsNotSet() { + Assert.assertFalse(preferences.isTraceLogEnabled()); + } + + @Test + public void shouldReturnTrueAfterEnablingTraceLog() { + preferences.enableTraceLog(); + + Assert.assertTrue(preferences.isTraceLogEnabled()); + } + + @Test + public void shouldReturnFalseAfterDisablingTraceLog() { + preferences.enableTraceLog(); + preferences.disableTraceLog(); + + Assert.assertFalse(preferences.isTraceLogEnabled()); + } + + @Test + public void shouldReturnCorrectDefaultServer() { + final var defaultServer = "https://api.netbird.io"; + + Assert.assertEquals(defaultServer, Preferences.defaultServer()); + } +} From 25fa80dc36dee5207111a02a427c069ceac3960c Mon Sep 17 00:00:00 2001 From: Diego Romar Date: Wed, 3 Sep 2025 16:35:53 -0300 Subject: [PATCH 02/21] Add methods to get and set enforcement of relay connection --- .../java/io/netbird/client/tool/Preferences.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/tool/src/main/java/io/netbird/client/tool/Preferences.java b/tool/src/main/java/io/netbird/client/tool/Preferences.java index e35b29d..c56eb75 100644 --- a/tool/src/main/java/io/netbird/client/tool/Preferences.java +++ b/tool/src/main/java/io/netbird/client/tool/Preferences.java @@ -6,6 +6,9 @@ public class Preferences { private final String keyTraceLog = "tracelog"; + + private final String keyForceRelayConnection = "isForceRelayConnectionEnabled"; + private final SharedPreferences sharedPref; public static String configFile(Context context){ @@ -27,6 +30,18 @@ public void disableTraceLog() { sharedPref.edit().putBoolean(keyTraceLog, false).apply(); } + public boolean isRelayConnectionEnforced() { + return sharedPref.getBoolean(keyForceRelayConnection, false); + } + + public void enableRelayConnectionEnforcement() { + sharedPref.edit().putBoolean(keyForceRelayConnection, true).apply(); + } + + public void disableRelayConnectionEnforcement() { + sharedPref.edit().putBoolean(keyForceRelayConnection, false).apply(); + } + public static String defaultServer() { return "https://api.netbird.io"; } From 4df11fd29bae9b7124bd0b116074274e7da15676 Mon Sep 17 00:00:00 2001 From: Diego Romar Date: Wed, 3 Sep 2025 18:37:28 -0300 Subject: [PATCH 03/21] Fix example instrumented test --- .../java/io/netbird/client/tool/ExampleInstrumentedTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tool/src/androidTest/java/io/netbird/client/tool/ExampleInstrumentedTest.java b/tool/src/androidTest/java/io/netbird/client/tool/ExampleInstrumentedTest.java index 1ba806e..af279fb 100644 --- a/tool/src/androidTest/java/io/netbird/client/tool/ExampleInstrumentedTest.java +++ b/tool/src/androidTest/java/io/netbird/client/tool/ExampleInstrumentedTest.java @@ -21,6 +21,6 @@ public class ExampleInstrumentedTest { public void useAppContext() { // Context of the app under test. Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); - assertEquals("io.netbird.client.backend.test", appContext.getPackageName()); + assertEquals("io.netbird.client.tool.test", appContext.getPackageName()); } } \ No newline at end of file From fc20caa0af3ac016b55b8649bff08f136c3a6146 Mon Sep 17 00:00:00 2001 From: Diego Romar Date: Wed, 3 Sep 2025 18:38:00 -0300 Subject: [PATCH 04/21] Add instrumented test to get EnvList --- .../tool/EnvVarPackagerInstrumentedTest.java | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 tool/src/androidTest/java/io/netbird/client/tool/EnvVarPackagerInstrumentedTest.java diff --git a/tool/src/androidTest/java/io/netbird/client/tool/EnvVarPackagerInstrumentedTest.java b/tool/src/androidTest/java/io/netbird/client/tool/EnvVarPackagerInstrumentedTest.java new file mode 100644 index 0000000..502eeed --- /dev/null +++ b/tool/src/androidTest/java/io/netbird/client/tool/EnvVarPackagerInstrumentedTest.java @@ -0,0 +1,27 @@ +package io.netbird.client.tool; + +import androidx.test.ext.junit.runners.AndroidJUnit4; +import androidx.test.platform.app.InstrumentationRegistry; + +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; + +import io.netbird.gomobile.android.Android; + +@RunWith(AndroidJUnit4.class) +public class EnvVarPackagerInstrumentedTest { + @Test + public void shouldReturnEnvironmentVariables() { + var preferences = new Preferences(InstrumentationRegistry.getInstrumentation().getTargetContext()); + var environmentVariables = EnvVarPackager.getEnvironmentVariables(preferences); + + Assert.assertNotNull(environmentVariables); + var forceRelay = environmentVariables.get(Android.getEnvKeyNBForceRelay()); + var variableNotPresentInList = environmentVariables.get("UNKNOWN_VAR"); + var emptyString = ""; + + Assert.assertNotEquals(emptyString, forceRelay); + Assert.assertEquals(emptyString, variableNotPresentInList); + } +} From d7175d7a53bdd80401a818e9737fce3d4474d9f5 Mon Sep 17 00:00:00 2001 From: Diego Romar Date: Wed, 3 Sep 2025 18:38:34 -0300 Subject: [PATCH 05/21] Add packager for environment variables --- .../io/netbird/client/tool/EnvVarPackager.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 tool/src/main/java/io/netbird/client/tool/EnvVarPackager.java diff --git a/tool/src/main/java/io/netbird/client/tool/EnvVarPackager.java b/tool/src/main/java/io/netbird/client/tool/EnvVarPackager.java new file mode 100644 index 0000000..ffce26f --- /dev/null +++ b/tool/src/main/java/io/netbird/client/tool/EnvVarPackager.java @@ -0,0 +1,14 @@ +package io.netbird.client.tool; + +import io.netbird.gomobile.android.Android; +import io.netbird.gomobile.android.EnvList; + +public class EnvVarPackager { + public static EnvList getEnvironmentVariables(Preferences preferences) { + var envList = new EnvList(); + + envList.put(Android.getEnvKeyNBForceRelay(), String.valueOf(preferences.isRelayConnectionEnforced())); + + return envList; + } +} From 3d0a1c9bc7abce56ff34351c7094342b1e620551 Mon Sep 17 00:00:00 2001 From: Diego Romar Date: Wed, 3 Sep 2025 18:43:04 -0300 Subject: [PATCH 06/21] Send list of environment variables to Android go client --- .../src/main/java/io/netbird/client/tool/EngineRunner.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) 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 331d329..55ec345 100644 --- a/tool/src/main/java/io/netbird/client/tool/EngineRunner.java +++ b/tool/src/main/java/io/netbird/client/tool/EngineRunner.java @@ -60,12 +60,15 @@ private synchronized void runClient(URLOpener urlOpener) { engineIsRunning = true; Runnable r = () -> { DNSWatch dnsWatch = new DNSWatch(context); + Preferences preferences = new Preferences(context); + var envList = EnvVarPackager.getEnvironmentVariables(preferences); + try { notifyServiceStateListeners(true); if(urlOpener == null) { - goClient.runWithoutLogin(dnsWatch.dnsServers(), () -> dnsWatch.setDNSChangeListener(this::changed)); + goClient.runWithoutLogin(dnsWatch.dnsServers(), () -> dnsWatch.setDNSChangeListener(this::changed), envList); } else { - goClient.run(urlOpener, dnsWatch.dnsServers(), () -> dnsWatch.setDNSChangeListener(this::changed)); + goClient.run(urlOpener, dnsWatch.dnsServers(), () -> dnsWatch.setDNSChangeListener(this::changed), envList); } } catch (Exception e) { Log.e(LOGTAG, "goClient error", e); From 52cdf0a1e6f5b1233ee9831da999b8856507da66 Mon Sep 17 00:00:00 2001 From: Diego Romar <18450339+doromaraujo@users.noreply.github.com> Date: Thu, 4 Sep 2025 15:15:12 -0300 Subject: [PATCH 07/21] Add strings for 'enforce relay connection' in advanced settings --- app/src/main/res/values/strings.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 910f66c..c8391dc 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -105,4 +105,6 @@ Dark Light Choose the app appearance mode. + Enforce relay connection + Enforces usage of relay when connecting. This will require the VPN service to be restarted. From d2296c74dc896d3a6208f424337050b178ba8360 Mon Sep 17 00:00:00 2001 From: Diego Romar <18450339+doromaraujo@users.noreply.github.com> Date: Thu, 4 Sep 2025 15:15:51 -0300 Subject: [PATCH 08/21] Add reusable component switch layout --- app/src/main/res/layout/component_switch.xml | 40 ++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 app/src/main/res/layout/component_switch.xml diff --git a/app/src/main/res/layout/component_switch.xml b/app/src/main/res/layout/component_switch.xml new file mode 100644 index 0000000..7c24a32 --- /dev/null +++ b/app/src/main/res/layout/component_switch.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + \ No newline at end of file From 23e2c8470ec5cd189502651b4da51a4889b6c95b Mon Sep 17 00:00:00 2001 From: Diego Romar <18450339+doromaraujo@users.noreply.github.com> Date: Thu, 4 Sep 2025 16:13:31 -0300 Subject: [PATCH 09/21] Add 'Enforce relay connection' to advanced configuration --- .../client/ui/advanced/AdvancedFragment.java | 18 ++++++++++++++++++ app/src/main/res/layout/fragment_advanced.xml | 14 ++++++++++++-- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/io/netbird/client/ui/advanced/AdvancedFragment.java b/app/src/main/java/io/netbird/client/ui/advanced/AdvancedFragment.java index 5e4a96b..ceca08c 100644 --- a/app/src/main/java/io/netbird/client/ui/advanced/AdvancedFragment.java +++ b/app/src/main/java/io/netbird/client/ui/advanced/AdvancedFragment.java @@ -15,6 +15,8 @@ import androidx.appcompat.app.AppCompatDelegate; import androidx.fragment.app.Fragment; +import io.netbird.client.R; +import io.netbird.client.databinding.ComponentSwitchBinding; import io.netbird.client.databinding.FragmentAdvancedBinding; import io.netbird.client.tool.Logcat; import io.netbird.client.tool.Preferences; @@ -28,6 +30,20 @@ public class AdvancedFragment extends Fragment { private FragmentAdvancedBinding binding; private io.netbird.gomobile.android.Preferences goPreferences; + private void configureEnforceRelayConnectionSwitch(@NonNull ComponentSwitchBinding binding, @NonNull Preferences preferences) { + binding.switchTitle.setText(R.string.advanced_enforce_relay); + binding.switchDescription.setText(R.string.advanced_enforce_relay_desc); + + binding.switchControl.setChecked(preferences.isRelayConnectionEnforced()); + binding.switchControl.setOnCheckedChangeListener((buttonView, isChecked) -> { + if (isChecked) { + preferences.enableRelayConnectionEnforcement(); + } else { + preferences.disableRelayConnectionEnforcement(); + } + }); + } + public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { @@ -122,6 +138,8 @@ public View onCreateView(@NonNull LayoutInflater inflater, } }); + configureEnforceRelayConnectionSwitch(binding.layoutEnforceRelayConnection, preferences); + // Initialize engine config switches (your settings) initializeEngineConfigSwitches(); diff --git a/app/src/main/res/layout/fragment_advanced.xml b/app/src/main/res/layout/fragment_advanced.xml index 4fb5556..50d32a1 100644 --- a/app/src/main/res/layout/fragment_advanced.xml +++ b/app/src/main/res/layout/fragment_advanced.xml @@ -43,7 +43,7 @@ android:textSize="14sp" android:inputType="textUri" android:background="@drawable/edit_text_white" - android:padding="12dp" + android:padding="16dp" android:textColor="@color/nb_txt" android:textColorHint="@color/nb_txt_light" app:layout_constraintTop_toBottomOf="@id/text_server_label" @@ -438,13 +438,23 @@ + + Date: Thu, 4 Sep 2025 16:39:55 -0300 Subject: [PATCH 10/21] Refactor 'force relay connection' layout id --- .../java/io/netbird/client/ui/advanced/AdvancedFragment.java | 2 +- app/src/main/res/layout/fragment_advanced.xml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/io/netbird/client/ui/advanced/AdvancedFragment.java b/app/src/main/java/io/netbird/client/ui/advanced/AdvancedFragment.java index ceca08c..cb92a32 100644 --- a/app/src/main/java/io/netbird/client/ui/advanced/AdvancedFragment.java +++ b/app/src/main/java/io/netbird/client/ui/advanced/AdvancedFragment.java @@ -138,7 +138,7 @@ public View onCreateView(@NonNull LayoutInflater inflater, } }); - configureEnforceRelayConnectionSwitch(binding.layoutEnforceRelayConnection, preferences); + configureEnforceRelayConnectionSwitch(binding.layoutForceRelayConnection, preferences); // Initialize engine config switches (your settings) initializeEngineConfigSwitches(); diff --git a/app/src/main/res/layout/fragment_advanced.xml b/app/src/main/res/layout/fragment_advanced.xml index 50d32a1..95d7fac 100644 --- a/app/src/main/res/layout/fragment_advanced.xml +++ b/app/src/main/res/layout/fragment_advanced.xml @@ -439,7 +439,7 @@ Date: Thu, 4 Sep 2025 17:05:09 -0300 Subject: [PATCH 11/21] Refactor 'force relay connection' feature references --- .../client/ui/advanced/AdvancedFragment.java | 10 +++++----- app/src/main/res/values/strings.xml | 4 ++-- .../tool/PreferencesInstrumentedTest.java | 18 +++++++++--------- .../io/netbird/client/tool/EnvVarPackager.java | 2 +- .../io/netbird/client/tool/Preferences.java | 8 ++++---- 5 files changed, 21 insertions(+), 21 deletions(-) diff --git a/app/src/main/java/io/netbird/client/ui/advanced/AdvancedFragment.java b/app/src/main/java/io/netbird/client/ui/advanced/AdvancedFragment.java index cb92a32..2dec46a 100644 --- a/app/src/main/java/io/netbird/client/ui/advanced/AdvancedFragment.java +++ b/app/src/main/java/io/netbird/client/ui/advanced/AdvancedFragment.java @@ -31,15 +31,15 @@ public class AdvancedFragment extends Fragment { private io.netbird.gomobile.android.Preferences goPreferences; private void configureEnforceRelayConnectionSwitch(@NonNull ComponentSwitchBinding binding, @NonNull Preferences preferences) { - binding.switchTitle.setText(R.string.advanced_enforce_relay); - binding.switchDescription.setText(R.string.advanced_enforce_relay_desc); + binding.switchTitle.setText(R.string.advanced_force_relay_conn); + binding.switchDescription.setText(R.string.advanced_force_relay_conn_desc); - binding.switchControl.setChecked(preferences.isRelayConnectionEnforced()); + binding.switchControl.setChecked(preferences.isConnectionForceRelayed()); binding.switchControl.setOnCheckedChangeListener((buttonView, isChecked) -> { if (isChecked) { - preferences.enableRelayConnectionEnforcement(); + preferences.enableForcedRelayConnection(); } else { - preferences.disableRelayConnectionEnforcement(); + preferences.disableForcedRelayConnection(); } }); } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c8391dc..e64262f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -105,6 +105,6 @@ Dark Light Choose the app appearance mode. - Enforce relay connection - Enforces usage of relay when connecting. This will require the VPN service to be restarted. + Force relay connection + Forces usage of relay when connecting to peers diff --git a/tool/src/androidTest/java/io/netbird/client/tool/PreferencesInstrumentedTest.java b/tool/src/androidTest/java/io/netbird/client/tool/PreferencesInstrumentedTest.java index 2e875e8..cf7a7f2 100644 --- a/tool/src/androidTest/java/io/netbird/client/tool/PreferencesInstrumentedTest.java +++ b/tool/src/androidTest/java/io/netbird/client/tool/PreferencesInstrumentedTest.java @@ -45,23 +45,23 @@ public void shouldCreatePreferencesWithoutThrownException() { } @Test - public void shouldReturnFalseWhenRelayConnectionEnforcementIsNotSet() { - Assert.assertFalse(preferences.isRelayConnectionEnforced()); + public void shouldReturnFalseWhenConnectionForceRelayedIsNotSet() { + Assert.assertFalse(preferences.isConnectionForceRelayed()); } @Test - public void shouldReturnTrueAfterEnablingRelayConnectionEnforcement() { - preferences.enableRelayConnectionEnforcement(); + public void shouldReturnTrueAfterEnablingForcedRelayConnection() { + preferences.enableForcedRelayConnection(); - Assert.assertTrue(preferences.isRelayConnectionEnforced()); + Assert.assertTrue(preferences.isConnectionForceRelayed()); } @Test - public void shouldReturnFalseAfterDisablingRelayConnectionEnforcement() { - preferences.enableRelayConnectionEnforcement(); - preferences.disableRelayConnectionEnforcement(); + public void shouldReturnFalseAfterDisablingForcedRelayConnection() { + preferences.enableForcedRelayConnection(); + preferences.disableForcedRelayConnection(); - Assert.assertFalse(preferences.isRelayConnectionEnforced()); + Assert.assertFalse(preferences.isConnectionForceRelayed()); } @Test diff --git a/tool/src/main/java/io/netbird/client/tool/EnvVarPackager.java b/tool/src/main/java/io/netbird/client/tool/EnvVarPackager.java index ffce26f..f6413e9 100644 --- a/tool/src/main/java/io/netbird/client/tool/EnvVarPackager.java +++ b/tool/src/main/java/io/netbird/client/tool/EnvVarPackager.java @@ -7,7 +7,7 @@ public class EnvVarPackager { public static EnvList getEnvironmentVariables(Preferences preferences) { var envList = new EnvList(); - envList.put(Android.getEnvKeyNBForceRelay(), String.valueOf(preferences.isRelayConnectionEnforced())); + envList.put(Android.getEnvKeyNBForceRelay(), String.valueOf(preferences.isConnectionForceRelayed())); return envList; } diff --git a/tool/src/main/java/io/netbird/client/tool/Preferences.java b/tool/src/main/java/io/netbird/client/tool/Preferences.java index c56eb75..1f9c7b7 100644 --- a/tool/src/main/java/io/netbird/client/tool/Preferences.java +++ b/tool/src/main/java/io/netbird/client/tool/Preferences.java @@ -7,7 +7,7 @@ public class Preferences { private final String keyTraceLog = "tracelog"; - private final String keyForceRelayConnection = "isForceRelayConnectionEnabled"; + private final String keyForceRelayConnection = "isConnectionForceRelayed"; private final SharedPreferences sharedPref; @@ -30,15 +30,15 @@ public void disableTraceLog() { sharedPref.edit().putBoolean(keyTraceLog, false).apply(); } - public boolean isRelayConnectionEnforced() { + public boolean isConnectionForceRelayed() { return sharedPref.getBoolean(keyForceRelayConnection, false); } - public void enableRelayConnectionEnforcement() { + public void enableForcedRelayConnection() { sharedPref.edit().putBoolean(keyForceRelayConnection, true).apply(); } - public void disableRelayConnectionEnforcement() { + public void disableForcedRelayConnection() { sharedPref.edit().putBoolean(keyForceRelayConnection, false).apply(); } From 86d4a5ab7209d023afbf43bb03b5260fbe0973cb Mon Sep 17 00:00:00 2001 From: Diego Romar <18450339+doromaraujo@users.noreply.github.com> Date: Fri, 5 Sep 2025 15:06:07 -0300 Subject: [PATCH 12/21] Add simple dialog to display alert messages --- .../layout/dialog_simple_alert_message.xml | 44 +++++++++++++++++++ app/src/main/res/values/strings.xml | 2 + 2 files changed, 46 insertions(+) create mode 100644 app/src/main/res/layout/dialog_simple_alert_message.xml diff --git a/app/src/main/res/layout/dialog_simple_alert_message.xml b/app/src/main/res/layout/dialog_simple_alert_message.xml new file mode 100644 index 0000000..cbf52aa --- /dev/null +++ b/app/src/main/res/layout/dialog_simple_alert_message.xml @@ -0,0 +1,44 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e64262f..21c547c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -107,4 +107,6 @@ Choose the app appearance mode. Force relay connection Forces usage of relay when connecting to peers + exclamation mark + This setting will be applied next time you connect your device. From 633711502188114dfe19439823a31b150374b8a8 Mon Sep 17 00:00:00 2001 From: Diego Romar <18450339+doromaraujo@users.noreply.github.com> Date: Fri, 5 Sep 2025 15:06:41 -0300 Subject: [PATCH 13/21] Display alert message when force relay is toggled --- .../client/ui/advanced/AdvancedFragment.java | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/io/netbird/client/ui/advanced/AdvancedFragment.java b/app/src/main/java/io/netbird/client/ui/advanced/AdvancedFragment.java index 2dec46a..174f334 100644 --- a/app/src/main/java/io/netbird/client/ui/advanced/AdvancedFragment.java +++ b/app/src/main/java/io/netbird/client/ui/advanced/AdvancedFragment.java @@ -9,9 +9,11 @@ import android.view.View; import android.view.ViewGroup; import android.widget.RadioGroup; +import android.widget.TextView; import android.widget.Toast; import androidx.annotation.NonNull; +import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AppCompatDelegate; import androidx.fragment.app.Fragment; @@ -30,7 +32,19 @@ public class AdvancedFragment extends Fragment { private FragmentAdvancedBinding binding; private io.netbird.gomobile.android.Preferences goPreferences; - private void configureEnforceRelayConnectionSwitch(@NonNull ComponentSwitchBinding binding, @NonNull Preferences preferences) { + private void showReconnectionNeededWarningDialog() { + final View dialogView = getLayoutInflater().inflate(R.layout.dialog_simple_alert_message, null); + final AlertDialog alertDialog = new AlertDialog.Builder(requireContext()) + .setView(dialogView) + .create(); + + ((TextView)dialogView.findViewById(R.id.txt_dialog)).setText(R.string.reconnectionNeededWarningMessage); + dialogView.findViewById(R.id.btn_ok_dialog).setOnClickListener(v -> alertDialog.dismiss()); + + alertDialog.show(); + } + + private void configureForceRelayConnectionSwitch(@NonNull ComponentSwitchBinding binding, @NonNull Preferences preferences) { binding.switchTitle.setText(R.string.advanced_force_relay_conn); binding.switchDescription.setText(R.string.advanced_force_relay_conn_desc); @@ -41,6 +55,8 @@ private void configureEnforceRelayConnectionSwitch(@NonNull ComponentSwitchBindi } else { preferences.disableForcedRelayConnection(); } + + showReconnectionNeededWarningDialog(); }); } @@ -138,7 +154,7 @@ public View onCreateView(@NonNull LayoutInflater inflater, } }); - configureEnforceRelayConnectionSwitch(binding.layoutForceRelayConnection, preferences); + configureForceRelayConnectionSwitch(binding.layoutForceRelayConnection, preferences); // Initialize engine config switches (your settings) initializeEngineConfigSwitches(); From 318e561bd8c2b4064b7253d5e04b80c3e08ee538 Mon Sep 17 00:00:00 2001 From: Diego Romar <18450339+doromaraujo@users.noreply.github.com> Date: Fri, 5 Sep 2025 15:12:14 -0300 Subject: [PATCH 14/21] Add ID to advanced fragment's ScrollView This will keep the view from scrolling to top when the user toggles the theme mode ( System | Light | Dark ) --- app/src/main/res/layout/fragment_advanced.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/res/layout/fragment_advanced.xml b/app/src/main/res/layout/fragment_advanced.xml index 95d7fac..23d5013 100644 --- a/app/src/main/res/layout/fragment_advanced.xml +++ b/app/src/main/res/layout/fragment_advanced.xml @@ -5,6 +5,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:fillViewport="true" + android:id="@+id/scr_vw_advanced" tools:context=".ui.advanced.AdvancedFragment"> Date: Fri, 5 Sep 2025 15:50:35 -0300 Subject: [PATCH 15/21] Add optional transparent background theme for AlertDialogs --- app/src/main/res/values/themes.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index 3f725ed..5a24308 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -57,4 +57,8 @@ @color/switch_track_color + + \ No newline at end of file From 5cda7631b8ff590d35bec707b794753be309dfd2 Mon Sep 17 00:00:00 2001 From: Diego Romar <18450339+doromaraujo@users.noreply.github.com> Date: Fri, 5 Sep 2025 15:59:23 -0300 Subject: [PATCH 16/21] Add round border shape whose color varies with the theme --- app/src/main/res/drawable/bg_rounded_nb_bg.xml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 app/src/main/res/drawable/bg_rounded_nb_bg.xml diff --git a/app/src/main/res/drawable/bg_rounded_nb_bg.xml b/app/src/main/res/drawable/bg_rounded_nb_bg.xml new file mode 100644 index 0000000..25a4b5a --- /dev/null +++ b/app/src/main/res/drawable/bg_rounded_nb_bg.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file From 8e347f366bc5d36016360c75b0bc9ca040a3c1d9 Mon Sep 17 00:00:00 2001 From: Diego Romar <18450339+doromaraujo@users.noreply.github.com> Date: Fri, 5 Sep 2025 16:00:09 -0300 Subject: [PATCH 17/21] Add rounded corners to simple alert message dialog layout --- app/src/main/res/layout/dialog_simple_alert_message.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/layout/dialog_simple_alert_message.xml b/app/src/main/res/layout/dialog_simple_alert_message.xml index cbf52aa..cd5f1b5 100644 --- a/app/src/main/res/layout/dialog_simple_alert_message.xml +++ b/app/src/main/res/layout/dialog_simple_alert_message.xml @@ -4,7 +4,7 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:background="@drawable/bg_rounded_white" + android:background="@drawable/bg_rounded_nb_bg" android:maxWidth="560dp" android:minWidth="280dp" android:padding="24dp"> From 1b00c07a674e854bc44539bda4ac8c00f7c64dcf Mon Sep 17 00:00:00 2001 From: Diego Romar <18450339+doromaraujo@users.noreply.github.com> Date: Fri, 5 Sep 2025 16:01:45 -0300 Subject: [PATCH 18/21] Add AlertDialogTheme to dialog shown on force relay toggle --- .../java/io/netbird/client/ui/advanced/AdvancedFragment.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/src/main/java/io/netbird/client/ui/advanced/AdvancedFragment.java b/app/src/main/java/io/netbird/client/ui/advanced/AdvancedFragment.java index 174f334..3e5bedb 100644 --- a/app/src/main/java/io/netbird/client/ui/advanced/AdvancedFragment.java +++ b/app/src/main/java/io/netbird/client/ui/advanced/AdvancedFragment.java @@ -34,13 +34,12 @@ public class AdvancedFragment extends Fragment { private void showReconnectionNeededWarningDialog() { final View dialogView = getLayoutInflater().inflate(R.layout.dialog_simple_alert_message, null); - final AlertDialog alertDialog = new AlertDialog.Builder(requireContext()) + final AlertDialog alertDialog = new AlertDialog.Builder(requireContext(), R.style.AlertDialogTheme) .setView(dialogView) .create(); ((TextView)dialogView.findViewById(R.id.txt_dialog)).setText(R.string.reconnectionNeededWarningMessage); dialogView.findViewById(R.id.btn_ok_dialog).setOnClickListener(v -> alertDialog.dismiss()); - alertDialog.show(); } From 95c9a804916eac0d46b5d12fe42aea60d206c735 Mon Sep 17 00:00:00 2001 From: Diego Romar <18450339+doromaraujo@users.noreply.github.com> Date: Fri, 5 Sep 2025 16:30:36 -0300 Subject: [PATCH 19/21] Update netbird's submodule reference to 64c1c6 This is the latest commit in branch netbird/feature/android-force-relay where the Go client's Run functions receive a list of environment variables --- netbird | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netbird b/netbird index f425870..64c1c6e 160000 --- a/netbird +++ b/netbird @@ -1 +1 @@ -Subproject commit f425870c8e76eb4997f225c8114fd9b32696599d +Subproject commit 64c1c6e3ad3114fd1879fe6f727fa436a806b235 From c373ef9cdeb27205d0117a4caf90aa3ef136b8a4 Mon Sep 17 00:00:00 2001 From: Diego Romar <18450339+doromaraujo@users.noreply.github.com> Date: Mon, 8 Sep 2025 09:13:18 -0300 Subject: [PATCH 20/21] Update "reconnection needed" text --- app/src/main/res/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 21c547c..c6687ff 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -108,5 +108,5 @@ Force relay connection Forces usage of relay when connecting to peers exclamation mark - This setting will be applied next time you connect your device. + To apply the setting, you will need to reconnect. From 3cba60368ec3bcdd9f8c67a418f75d7b740ec93a Mon Sep 17 00:00:00 2001 From: Diego Romar <18450339+doromaraujo@users.noreply.github.com> Date: Mon, 8 Sep 2025 09:52:33 -0300 Subject: [PATCH 21/21] Update netbird's submodule reference to a53243 --- netbird | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netbird b/netbird index 64c1c6e..a53243e 160000 --- a/netbird +++ b/netbird @@ -1 +1 @@ -Subproject commit 64c1c6e3ad3114fd1879fe6f727fa436a806b235 +Subproject commit a53243eed0c575d92545ac825ee8c376bf342926