diff options
13 files changed, 165 insertions, 44 deletions
diff --git a/main/src/main/aidl/de/blinkt/openvpn/core/IOpenVPNServiceInternal.aidl b/main/src/main/aidl/de/blinkt/openvpn/core/IOpenVPNServiceInternal.aidl new file mode 100644 index 00000000..3958bcf3 --- /dev/null +++ b/main/src/main/aidl/de/blinkt/openvpn/core/IOpenVPNServiceInternal.aidl @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2012-2016 Arne Schwabe + * Distributed under the GNU GPL v2 with additional terms. For full terms see the file doc/LICENSE.txt + */ + +package de.blinkt.openvpn.core; + +/** + * Created by arne on 15.11.16. + */ + +interface IOpenVPNServiceInternal { + + boolean protect(int fd); + + void userPause(boolean b); + + /** + * @param replaceConnection True if the VPN is connected by a new connection. + * @return true if there was a process that has been send a stop signal + */ + boolean stopVPN(boolean replaceConnection); +} diff --git a/main/src/main/aidl/de/blinkt/openvpn/core/IServiceStatus.aidl b/main/src/main/aidl/de/blinkt/openvpn/core/IServiceStatus.aidl index 49bf0619..0772dcb9 100644 --- a/main/src/main/aidl/de/blinkt/openvpn/core/IServiceStatus.aidl +++ b/main/src/main/aidl/de/blinkt/openvpn/core/IServiceStatus.aidl @@ -13,6 +13,7 @@ interface IServiceStatus { /** * Remove a previously registered callback interface. - */ + */ void unregisterStatusCallback(in IStatusCallbacks cb); + } diff --git a/main/src/main/aidl/de/blinkt/openvpn/core/IStatusCallbacks.aidl b/main/src/main/aidl/de/blinkt/openvpn/core/IStatusCallbacks.aidl index 23bee8b4..b72a2ffa 100644 --- a/main/src/main/aidl/de/blinkt/openvpn/core/IStatusCallbacks.aidl +++ b/main/src/main/aidl/de/blinkt/openvpn/core/IStatusCallbacks.aidl @@ -18,4 +18,6 @@ interface IStatusCallbacks { oneway void updateStateString(in String state, in String msg, in int resid, in ConnectionStatus level); oneway void updateByteCount(long inBytes, long outBytes); + + oneway void connectedVPN(String uuid); } diff --git a/main/src/main/java/de/blinkt/openvpn/OpenVPNTileService.java b/main/src/main/java/de/blinkt/openvpn/OpenVPNTileService.java index 3996f25e..ce14cc98 100644 --- a/main/src/main/java/de/blinkt/openvpn/OpenVPNTileService.java +++ b/main/src/main/java/de/blinkt/openvpn/OpenVPNTileService.java @@ -13,11 +13,13 @@ import android.content.Intent; import android.content.ServiceConnection; import android.os.Build; import android.os.IBinder; +import android.os.RemoteException; import android.service.quicksettings.Tile; import android.service.quicksettings.TileService; import android.widget.Toast; import de.blinkt.openvpn.core.ConnectionStatus; +import de.blinkt.openvpn.core.IOpenVPNServiceInternal; import de.blinkt.openvpn.core.OpenVPNService; import de.blinkt.openvpn.core.ProfileManager; import de.blinkt.openvpn.core.VpnStatus; @@ -57,10 +59,14 @@ public class OpenVPNTileService extends TileService implements VpnStatus.StateLi bindService(intent, new ServiceConnection() { @Override public void onServiceConnected(ComponentName componentName, IBinder binder) { - OpenVPNService service = ((OpenVPNService.LocalBinder) binder).getService(); + IOpenVPNServiceInternal service = IOpenVPNServiceInternal.Stub.asInterface(binder); - if (service != null && service.getManagement() != null) - service.getManagement().stopVPN(false); + if (service != null) + try { + service.stopVPN(false); + } catch (RemoteException e) { + VpnStatus.logException(e); + } unbindService(this); } @@ -119,7 +125,7 @@ public class OpenVPNTileService extends TileService implements VpnStatus.StateLi t.setState(Tile.STATE_INACTIVE); } } else { - vpn = ProfileManager.getLastConnectedVpn(); + vpn = ProfileManager.get(getBaseContext(), VpnStatus.getLastConnectedVPNProfile()); String name; if (vpn == null) name = "null?!"; @@ -129,11 +135,15 @@ public class OpenVPNTileService extends TileService implements VpnStatus.StateLi t.setState(Tile.STATE_ACTIVE); } - t.updateTile(); } @Override + public void setConnectedVPN(String uuid) { + + } + + @Override public void onStopListening() { VpnStatus.removeStateListener(this); super.onStopListening(); diff --git a/main/src/main/java/de/blinkt/openvpn/activities/DisconnectVPN.java b/main/src/main/java/de/blinkt/openvpn/activities/DisconnectVPN.java index f63f5ed2..c3a0072b 100644 --- a/main/src/main/java/de/blinkt/openvpn/activities/DisconnectVPN.java +++ b/main/src/main/java/de/blinkt/openvpn/activities/DisconnectVPN.java @@ -7,15 +7,17 @@ package de.blinkt.openvpn.activities; import android.app.Activity; import android.app.AlertDialog; -import android.content.*; +import android.content.ComponentName; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.ServiceConnection; import android.os.IBinder; -import android.os.Message; -import android.os.Messenger; import android.os.RemoteException; import de.blinkt.openvpn.LaunchVPN; import de.blinkt.openvpn.R; -import de.blinkt.openvpn.VpnProfile; +import de.blinkt.openvpn.core.IOpenVPNServiceInternal; import de.blinkt.openvpn.core.OpenVPNService; import de.blinkt.openvpn.core.ProfileManager; import de.blinkt.openvpn.core.VpnStatus; @@ -24,7 +26,7 @@ import de.blinkt.openvpn.core.VpnStatus; * Created by arne on 13.10.13. */ public class DisconnectVPN extends Activity implements DialogInterface.OnClickListener, DialogInterface.OnCancelListener { - private Messenger mMessenger; + private IOpenVPNServiceInternal mService; private ServiceConnection mConnection = new ServiceConnection() { @@ -32,13 +34,13 @@ public class DisconnectVPN extends Activity implements DialogInterface.OnClickLi @Override public void onServiceConnected(ComponentName className, IBinder service) { - mMessenger = new Messenger(service); + mService = IOpenVPNServiceInternal.Stub.asInterface(service); } @Override public void onServiceDisconnected(ComponentName arg0) { - mMessenger = null; + mService = null; } }; @@ -72,20 +74,18 @@ public class DisconnectVPN extends Activity implements DialogInterface.OnClickLi @Override public void onClick(DialogInterface dialog, int which) { - VpnProfile lastVPN = ProfileManager.getLastConnectedVpn(); if (which == DialogInterface.BUTTON_POSITIVE) { ProfileManager.setConntectedVpnProfileDisconnected(this); - if (mMessenger != null) { - Message msg = Message.obtain(null, OpenVPNService.DISCONNECT_VPN_MSG); + if (mService != null) { try { - mMessenger.send(msg); + mService.stopVPN(false); } catch (RemoteException e) { VpnStatus.logException(e); } } - } else if (which == DialogInterface.BUTTON_NEUTRAL && lastVPN !=null) { + } else if (which == DialogInterface.BUTTON_NEUTRAL) { Intent intent = new Intent(this, LaunchVPN.class); - intent.putExtra(LaunchVPN.EXTRA_KEY, lastVPN.getUUID().toString()); + intent.putExtra(LaunchVPN.EXTRA_KEY, VpnStatus.getLastConnectedVPNProfile()); intent.setAction(Intent.ACTION_MAIN); startActivity(intent); } diff --git a/main/src/main/java/de/blinkt/openvpn/api/ExternalOpenVPNService.java b/main/src/main/java/de/blinkt/openvpn/api/ExternalOpenVPNService.java index ce72f346..6d7e9a4b 100644 --- a/main/src/main/java/de/blinkt/openvpn/api/ExternalOpenVPNService.java +++ b/main/src/main/java/de/blinkt/openvpn/api/ExternalOpenVPNService.java @@ -37,8 +37,8 @@ import de.blinkt.openvpn.VpnProfile; import de.blinkt.openvpn.core.ConfigParser;
import de.blinkt.openvpn.core.ConfigParser.ConfigParseError;
import de.blinkt.openvpn.core.ConnectionStatus;
+import de.blinkt.openvpn.core.IOpenVPNServiceInternal;
import de.blinkt.openvpn.core.OpenVPNService;
-import de.blinkt.openvpn.core.OpenVPNService.LocalBinder;
import de.blinkt.openvpn.core.ProfileManager;
import de.blinkt.openvpn.core.VPNLaunchHelper;
import de.blinkt.openvpn.core.VpnStatus;
@@ -52,7 +52,7 @@ public class ExternalOpenVPNService extends Service implements StateListener { final RemoteCallbackList<IOpenVPNStatusCallback> mCallbacks =
new RemoteCallbackList<>();
- private OpenVPNService mService;
+ private IOpenVPNServiceInternal mService;
private ExternalAppDatabase mExtAppDb;
@@ -63,8 +63,7 @@ public class ExternalOpenVPNService extends Service implements StateListener { public void onServiceConnected(ComponentName className,
IBinder service) {
// We've bound to LocalService, cast the IBinder and get LocalService instance
- LocalBinder binder = (LocalBinder) service;
- mService = binder.getService();
+ mService = (IOpenVPNServiceInternal) (service);
}
@Override
@@ -82,8 +81,12 @@ public class ExternalOpenVPNService extends Service implements StateListener { VpnProfile vp = ProfileManager.getLastConnectedVpn();
if (ProfileManager.isTempProfile()) {
if(intent.getPackage().equals(vp.mProfileCreator)) {
- if (mService != null && mService.getManagement() != null)
- mService.getManagement().stopVPN(false);
+ if (mService != null)
+ try {
+ mService.stopVPN(false);
+ } catch (RemoteException e) {
+ e.printStackTrace();
+ }
}
}
}
@@ -304,8 +307,8 @@ public class ExternalOpenVPNService extends Service implements StateListener { @Override
public void disconnect() throws RemoteException {
checkOpenVPNPermission();
- if (mService != null && mService.getManagement() != null)
- mService.getManagement().stopVPN(false);
+ if (mService != null)
+ mService.stopVPN(false);
}
@Override
@@ -347,9 +350,9 @@ public class ExternalOpenVPNService extends Service implements StateListener { public String state;
public String logmessage;
public ConnectionStatus level;
- public String vpnUUID;
+ String vpnUUID;
- public UpdateMessage(String state, String logmessage, ConnectionStatus level) {
+ UpdateMessage(String state, String logmessage, ConnectionStatus level) {
this.state = state;
this.logmessage = logmessage;
this.level = level;
@@ -367,6 +370,11 @@ public class ExternalOpenVPNService extends Service implements StateListener { }
+ @Override
+ public void setConnectedVPN(String uuid) {
+
+ }
+
private static final OpenVPNServiceHandler mHandler = new OpenVPNServiceHandler();
diff --git a/main/src/main/java/de/blinkt/openvpn/core/ICSOpenVPNApplication.java b/main/src/main/java/de/blinkt/openvpn/core/ICSOpenVPNApplication.java index 4b31180a..7d10063f 100644 --- a/main/src/main/java/de/blinkt/openvpn/core/ICSOpenVPNApplication.java +++ b/main/src/main/java/de/blinkt/openvpn/core/ICSOpenVPNApplication.java @@ -24,10 +24,6 @@ public class ICSOpenVPNApplication extends Application { super.onCreate(); PRNGFixes.apply(); - if (BuildConfig.DEBUG) { - //ACRA.init(this); - } - VpnStatus.initLogCache(getApplicationContext().getCacheDir()); mStatus = new StatusListener(); diff --git a/main/src/main/java/de/blinkt/openvpn/core/OpenVPNService.java b/main/src/main/java/de/blinkt/openvpn/core/OpenVPNService.java index 818ef30a..86a4043a 100644 --- a/main/src/main/java/de/blinkt/openvpn/core/OpenVPNService.java +++ b/main/src/main/java/de/blinkt/openvpn/core/OpenVPNService.java @@ -27,6 +27,7 @@ import android.os.Handler.Callback; import android.os.IBinder; import android.os.Message; import android.os.ParcelFileDescriptor; +import android.os.RemoteException; import android.preference.PreferenceManager; import android.system.OsConstants; import android.text.TextUtils; @@ -34,6 +35,7 @@ import android.util.Log; import android.widget.Toast; import java.io.IOException; +import java.lang.ref.WeakReference; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.net.Inet6Address; @@ -55,7 +57,7 @@ import static de.blinkt.openvpn.core.NetworkSpace.ipAddress; import static de.blinkt.openvpn.core.ConnectionStatus.LEVEL_CONNECTED; import static de.blinkt.openvpn.core.ConnectionStatus.LEVEL_WAITING_FOR_USER_INPUT; -public class OpenVPNService extends VpnService implements StateListener, Callback, ByteCountListener { +public class OpenVPNService extends VpnService implements StateListener, Callback, ByteCountListener, IOpenVPNServiceInternal { public static final String START_SERVICE = "de.blinkt.openvpn.START_SERVICE"; public static final String START_SERVICE_STICKY = "de.blinkt.openvpn.START_SERVICE_STICKY"; public static final String ALWAYS_SHOW_NOTIFICATION = "de.blinkt.openvpn.NOTIFICATION_ALWAYS_VISIBLE"; @@ -63,7 +65,6 @@ public class OpenVPNService extends VpnService implements StateListener, Callbac private static final String PAUSE_VPN = "de.blinkt.openvpn.PAUSE_VPN"; private static final String RESUME_VPN = "de.blinkt.openvpn.RESUME_VPN"; private static final int OPENVPN_STATUS = 1; - public static final int DISCONNECT_VPN_MSG = 100; private static boolean mNotificationAlwaysVisible = false; private final Vector<String> mDnslist = new Vector<>(); private final NetworkSpace mRoutes = new NetworkSpace(); @@ -88,6 +89,24 @@ public class OpenVPNService extends VpnService implements StateListener, Callbac private Runnable mOpenVPNThread; private static Class mNotificationActivityClass; + private final IBinder mBinder = new IOpenVPNServiceInternal.Stub() { + + @Override + public boolean protect(int fd) throws RemoteException { + return OpenVPNService.this.protect(fd); + } + + @Override + public void userPause(boolean shouldbePaused) throws RemoteException { + OpenVPNService.this.userPause(shouldbePaused); + } + + @Override + public boolean stopVPN(boolean replaceConnection) throws RemoteException { + return OpenVPNService.this.stopVPN(replaceConnection); + } + }; + // From: http://stackoverflow.com/questions/3758606/how-to-convert-byte-size-into-human-readable-format-in-java public static String humanReadableByteCount(long bytes, boolean mbit) { if (mbit) @@ -340,6 +359,14 @@ public class OpenVPNService extends VpnService implements StateListener, Callbac } @Override + public boolean stopVPN(boolean replaceConnection) throws RemoteException { + if(getManagement() !=null) + return getManagement().stopVPN(replaceConnection); + else + return false; + } + + @Override public int onStartCommand(Intent intent, int flags, int startId) { if (intent != null && intent.getBooleanExtra(ALWAYS_SHOW_NOTIFICATION, false)) @@ -405,6 +432,7 @@ public class OpenVPNService extends VpnService implements StateListener, Callbac ProfileManager.setConnectedVpnProfile(this, mProfile); + VpnStatus.setConnectedVPNProfile(mProfile.getUUIDString()); /* TODO: At the moment we have no way to handle asynchronous PW input * Fixing will also allow to handle challenge/response authentication */ if (mProfile.needUserPWInput(true) != 0) @@ -542,6 +570,16 @@ public class OpenVPNService extends VpnService implements StateListener, Callbac } @Override + public IBinder asBinder() { + return mBinder; + } + + @Override + public void onCreate() { + super.onCreate(); + } + + @Override public void onDestroy() { synchronized (mProcessLock) { if (mProcessThread != null) { @@ -555,7 +593,6 @@ public class OpenVPNService extends VpnService implements StateListener, Callbac // Just in case unregister for state VpnStatus.removeStateListener(this); VpnStatus.flushLog(); - } private String getTunConfigString() { @@ -969,6 +1006,10 @@ public class OpenVPNService extends VpnService implements StateListener, Callbac } } + @Override + public void setConnectedVPN(String uuid) { + } + private void doSendBroadcast(String state, ConnectionStatus level) { Intent vpnstatus = new Intent(); vpnstatus.setAction("de.blinkt.openvpn.VPN_STATUS"); diff --git a/main/src/main/java/de/blinkt/openvpn/core/OpenVPNStatusService.java b/main/src/main/java/de/blinkt/openvpn/core/OpenVPNStatusService.java index f84445ad..4b32d9fa 100644 --- a/main/src/main/java/de/blinkt/openvpn/core/OpenVPNStatusService.java +++ b/main/src/main/java/de/blinkt/openvpn/core/OpenVPNStatusService.java @@ -104,11 +104,18 @@ public class OpenVPNStatusService extends Service implements VpnStatus.LogListen msg.sendToTarget(); } + @Override + public void setConnectedVPN(String uuid) { + Message msg = mHandler.obtainMessage(SEND_NEW_CONNECTED_VPN, uuid); + msg.sendToTarget(); + } + private static final OpenVPNStatusHandler mHandler = new OpenVPNStatusHandler(); private static final int SEND_NEW_LOGITEM = 100; private static final int SEND_NEW_STATE = 101; private static final int SEND_NEW_BYTECOUNT = 102; + private static final int SEND_NEW_CONNECTED_VPN = 103; static class OpenVPNStatusHandler extends Handler { WeakReference<OpenVPNStatusService> service = null; @@ -142,6 +149,10 @@ public class OpenVPNStatusService extends Service implements VpnStatus.LogListen case SEND_NEW_STATE: sendUpdate(broadcastItem, (UpdateMessage) msg.obj); break; + + case SEND_NEW_CONNECTED_VPN: + broadcastItem.connectedVPN((String) msg.obj); + break; } } catch (RemoteException e) { // The RemoteCallbackList will take care of removing diff --git a/main/src/main/java/de/blinkt/openvpn/core/StatusListener.java b/main/src/main/java/de/blinkt/openvpn/core/StatusListener.java index d0f845ee..d6660147 100644 --- a/main/src/main/java/de/blinkt/openvpn/core/StatusListener.java +++ b/main/src/main/java/de/blinkt/openvpn/core/StatusListener.java @@ -72,6 +72,11 @@ public class StatusListener { public void updateByteCount(long inBytes, long outBytes) throws RemoteException { VpnStatus.updateByteCount(inBytes, outBytes); } + + @Override + public void connectedVPN(String uuid) throws RemoteException { + VpnStatus.setConnectedVPNProfile(uuid); + } }; } diff --git a/main/src/main/java/de/blinkt/openvpn/core/VpnStatus.java b/main/src/main/java/de/blinkt/openvpn/core/VpnStatus.java index 5f6a30d6..db0d10bd 100644 --- a/main/src/main/java/de/blinkt/openvpn/core/VpnStatus.java +++ b/main/src/main/java/de/blinkt/openvpn/core/VpnStatus.java @@ -18,6 +18,7 @@ import java.util.Locale; import java.util.Vector; import de.blinkt.openvpn.R; +import de.blinkt.openvpn.VpnProfile; public class VpnStatus { @@ -37,6 +38,8 @@ public class VpnStatus { private static long mlastByteCount[] = {0, 0, 0, 0}; private static HandlerThread mHandlerThread; + private static String mLastConnectedVPNUUID; + public static void logException(LogLevel ll, String context, Exception e) { StringWriter sw = new StringWriter(); e.printStackTrace(new PrintWriter(sw)); @@ -123,6 +126,18 @@ public class VpnStatus { mLogFileHandler.sendEmptyMessage(LogFileHandler.FLUSH_TO_DISK); } + public static void setConnectedVPNProfile(String uuid) { + mLastConnectedVPNUUID = uuid; + for (StateListener sl: stateListener) + sl.setConnectedVPN(uuid); + } + + + public static String getLastConnectedVPNProfile() + { + return mLastConnectedVPNUUID; + } + public enum LogLevel { INFO(2), @@ -158,10 +173,10 @@ public class VpnStatus { } // keytool -printcert -jarfile de.blinkt.openvpn_85.apk - public static final byte[] officalkey = {-58, -42, -44, -106, 90, -88, -87, -88, -52, -124, 84, 117, 66, 79, -112, -111, -46, 86, -37, 109}; - public static final byte[] officaldebugkey = {-99, -69, 45, 71, 114, -116, 82, 66, -99, -122, 50, -70, -56, -111, 98, -35, -65, 105, 82, 43}; - public static final byte[] amazonkey = {-116, -115, -118, -89, -116, -112, 120, 55, 79, -8, -119, -23, 106, -114, -85, -56, -4, 105, 26, -57}; - public static final byte[] fdroidkey = {-92, 111, -42, -46, 123, -96, -60, 79, -27, -31, 49, 103, 11, -54, -68, -27, 17, 2, 121, 104}; + static final byte[] officalkey = {-58, -42, -44, -106, 90, -88, -87, -88, -52, -124, 84, 117, 66, 79, -112, -111, -46, 86, -37, 109}; + static final byte[] officaldebugkey = {-99, -69, 45, 71, 114, -116, 82, 66, -99, -122, 50, -70, -56, -111, 98, -35, -65, 105, 82, 43}; + static final byte[] amazonkey = {-116, -115, -118, -89, -116, -112, 120, 55, 79, -8, -119, -23, 106, -114, -85, -56, -4, 105, 26, -57}; + static final byte[] fdroidkey = {-92, 111, -42, -46, 123, -96, -60, 79, -27, -31, 49, 103, 11, -54, -68, -27, 17, 2, 121, 104}; private static ConnectionStatus mLastLevel = ConnectionStatus.LEVEL_NOTCONNECTED; @@ -186,6 +201,8 @@ public class VpnStatus { public interface StateListener { void updateState(String state, String logmessage, int localizedResId, ConnectionStatus level); + + void setConnectedVPN(String uuid); } public interface ByteCountListener { diff --git a/main/src/main/java/de/blinkt/openvpn/fragments/LogFragment.java b/main/src/main/java/de/blinkt/openvpn/fragments/LogFragment.java index 067c7390..d704e61e 100644 --- a/main/src/main/java/de/blinkt/openvpn/fragments/LogFragment.java +++ b/main/src/main/java/de/blinkt/openvpn/fragments/LogFragment.java @@ -431,7 +431,7 @@ public class LogFragment extends ListFragment implements StateListener, SeekBar. } else if (item.getItemId() == R.id.send) { ladapter.shareLog(); } else if (item.getItemId() == R.id.edit_vpn) { - VpnProfile lastConnectedprofile = ProfileManager.getLastConnectedVpn(); + VpnProfile lastConnectedprofile = ProfileManager.get(getActivity(), VpnStatus.getLastConnectedVPNProfile()); if (lastConnectedprofile != null) { Intent vprefintent = new Intent(getActivity(), VPNPreferences.class) @@ -674,6 +674,10 @@ public class LogFragment extends ListFragment implements StateListener, SeekBar. } } + @Override + public void setConnectedVPN(String uuid) { + } + @Override public void onDestroy() { diff --git a/main/src/main/java/de/blinkt/openvpn/fragments/VPNProfileList.java b/main/src/main/java/de/blinkt/openvpn/fragments/VPNProfileList.java index de41d509..2aaf81c6 100644 --- a/main/src/main/java/de/blinkt/openvpn/fragments/VPNProfileList.java +++ b/main/src/main/java/de/blinkt/openvpn/fragments/VPNProfileList.java @@ -66,8 +66,11 @@ public class VPNProfileList extends ListFragment implements OnClickListener, Vpn }); } + @Override + public void setConnectedVPN(String uuid) { + } - class VPNArrayAdapter extends ArrayAdapter<VpnProfile> { + private class VPNArrayAdapter extends ArrayAdapter<VpnProfile> { public VPNArrayAdapter(Context context, int resource, int textViewResourceId) { @@ -99,7 +102,7 @@ public class VPNProfileList extends ListFragment implements OnClickListener, Vpn }); TextView subtitle = (TextView) v.findViewById(R.id.vpn_item_subtitle); - if (ProfileManager.getLastConnectedVpn() == profile) { + if (profile.getUUIDString().equals(VpnStatus.getLastConnectedVPNProfile())) { subtitle.setText(mLastStatusMessage); subtitle.setVisibility(View.VISIBLE); } else { @@ -113,7 +116,7 @@ public class VPNProfileList extends ListFragment implements OnClickListener, Vpn } private void startOrStopVPN(VpnProfile profile) { - if (VpnStatus.isVPNActive() && ProfileManager.getLastConnectedVpn() == profile) { + if (VpnStatus.isVPNActive() && profile.getUUIDString().equals(VpnStatus.getLastConnectedVPNProfile())) { Intent disconnectVPN = new Intent(getActivity(), DisconnectVPN.class); startActivity(disconnectVPN); } else { |