Skip to content

Commit 2536a83

Browse files
authored
Replace VPNServiceRepository with ServiceAccessor pattern (#114)
VPNServiceRepository created its own service binding which caused conflicts when unbinding - it would disconnect other components relying on the service. Now NetworksFragmentViewModel uses ServiceAccessor from MainActivity, which maintains a single shared service binding across all components.
1 parent a7be162 commit 2536a83

File tree

7 files changed

+162
-225
lines changed

7 files changed

+162
-225
lines changed

app/src/main/java/io/netbird/client/MainActivity.java

Lines changed: 41 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,9 @@
22

33
import android.animation.StateListAnimator;
44
import android.app.Activity;
5-
import android.content.BroadcastReceiver;
65
import android.content.ComponentName;
76
import android.content.Context;
87
import android.content.Intent;
9-
import android.content.IntentFilter;
108
import android.content.ServiceConnection;
119
import android.graphics.drawable.ColorDrawable;
1210
import android.net.Uri;
@@ -32,7 +30,6 @@
3230
import androidx.appcompat.app.AlertDialog;
3331
import androidx.core.content.ContextCompat;
3432
import androidx.core.view.GravityCompat;
35-
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
3633
import androidx.navigation.NavController;
3734
import androidx.navigation.Navigation;
3835
import androidx.navigation.ui.AppBarConfiguration;
@@ -41,7 +38,7 @@
4138
import androidx.appcompat.app.AppCompatActivity;
4239

4340
import io.netbird.client.databinding.ActivityMainBinding;
44-
import io.netbird.client.tool.NetworkChangeNotifier;
41+
import io.netbird.client.tool.RouteChangeListener;
4542
import io.netbird.client.tool.ServiceStateListener;
4643
import io.netbird.client.tool.VPNService;
4744
import io.netbird.client.ui.PreferenceUI;
@@ -369,6 +366,46 @@ public NetworkArray getNetworks() {
369366
return mBinder.networks();
370367
}
371368

369+
@Override
370+
public void selectRoute(String route) throws Exception {
371+
if (mBinder == null) {
372+
Log.w(LOGTAG, "VPN binder is null");
373+
return;
374+
}
375+
376+
mBinder.selectRoute(route);
377+
}
378+
379+
@Override
380+
public void deselectRoute(String route) throws Exception {
381+
if (mBinder == null) {
382+
Log.w(LOGTAG, "VPN binder is null");
383+
return;
384+
}
385+
386+
mBinder.deselectRoute(route);
387+
}
388+
389+
@Override
390+
public void addRouteChangeListener(RouteChangeListener listener) {
391+
if (mBinder == null) {
392+
Log.w(LOGTAG, "VPN binder is null");
393+
return;
394+
}
395+
396+
mBinder.addRouteChangeListener(listener);
397+
}
398+
399+
@Override
400+
public void removeRouteChangeListener(RouteChangeListener listener) {
401+
if (mBinder == null) {
402+
Log.w(LOGTAG, "VPN binder is null");
403+
return;
404+
}
405+
406+
mBinder.removeRouteChangeListener(listener);
407+
}
408+
372409

373410
@Override
374411
public void registerServiceStateListener(StateListener listener) {
Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,9 @@
11
package io.netbird.client;
22

33
import android.app.Application;
4-
import android.content.IntentFilter;
54
import android.content.SharedPreferences;
65

76
import androidx.appcompat.app.AppCompatDelegate;
8-
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
9-
10-
import io.netbird.client.repository.VPNServiceRepository;
11-
import io.netbird.client.tool.NetworkChangeNotifier;
127

138
public class MyApplication extends Application {
149

@@ -20,8 +15,4 @@ public void onCreate() {
2015
int themeMode = prefs.getInt("theme_mode", AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM);
2116
AppCompatDelegate.setDefaultNightMode(themeMode);
2217
}
23-
24-
public VPNServiceRepository getVPNServiceRepository() {
25-
return new VPNServiceRepository(this);
26-
}
2718
}

app/src/main/java/io/netbird/client/ServiceAccessor.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package io.netbird.client;
22

3+
import io.netbird.client.tool.RouteChangeListener;
34
import io.netbird.gomobile.android.NetworkArray;
45
import io.netbird.gomobile.android.PeerInfoArray;
56

@@ -10,4 +11,10 @@ public interface ServiceAccessor {
1011

1112
NetworkArray getNetworks();
1213
void stopEngine();
14+
15+
void selectRoute(String route) throws Exception;
16+
void deselectRoute(String route) throws Exception;
17+
18+
void addRouteChangeListener(RouteChangeListener listener);
19+
void removeRouteChangeListener(RouteChangeListener listener);
1320
}

app/src/main/java/io/netbird/client/repository/VPNServiceBindListener.java

Lines changed: 0 additions & 5 deletions
This file was deleted.

app/src/main/java/io/netbird/client/repository/VPNServiceRepository.java

Lines changed: 0 additions & 173 deletions
This file was deleted.

app/src/main/java/io/netbird/client/ui/home/NetworksFragment.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424

2525
import io.netbird.client.PlatformUtils;
2626
import io.netbird.client.R;
27+
import io.netbird.client.ServiceAccessor;
2728
import io.netbird.client.StateListenerRegistry;
2829
import io.netbird.client.databinding.FragmentNetworksBinding;
2930

@@ -35,6 +36,7 @@ public class NetworksFragment extends Fragment {
3536
private final List<RoutingPeer> peers = new ArrayList<>();
3637
private NetworksFragmentViewModel model;
3738
private StateListenerRegistry stateListenerRegistry;
39+
private ServiceAccessor serviceAccessor;
3840

3941
@Override
4042
public void onAttach(@NonNull Context context) {
@@ -45,6 +47,12 @@ public void onAttach(@NonNull Context context) {
4547
} else {
4648
throw new RuntimeException(context + " must implement StateListenerRegistry");
4749
}
50+
51+
if (context instanceof ServiceAccessor) {
52+
serviceAccessor = (ServiceAccessor) context;
53+
} else {
54+
throw new RuntimeException(context + " must implement ServiceAccessor");
55+
}
4856
}
4957

5058
@Nullable
@@ -58,8 +66,7 @@ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup c
5866
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
5967
super.onViewCreated(view, savedInstanceState);
6068

61-
model = new ViewModelProvider(this,
62-
ViewModelProvider.Factory.from(NetworksFragmentViewModel.initializer))
69+
model = new ViewModelProvider(this, NetworksFragmentViewModel.getFactory(serviceAccessor))
6370
.get(NetworksFragmentViewModel.class);
6471
stateListenerRegistry.registerServiceStateListener(model);
6572

0 commit comments

Comments
 (0)