From 342515f91606a4b1e953d112c0d0d47f1ff74d0c Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sun, 1 Dec 2019 20:05:09 -0800 Subject: [PATCH] Force remote streaming optimizations if a VPN is active --- app/src/main/java/com/limelight/Game.java | 12 +++++-- .../computers/ComputerManagerService.java | 26 ++------------- .../java/com/limelight/utils/NetHelper.java | 32 +++++++++++++++++++ 3 files changed, 44 insertions(+), 26 deletions(-) create mode 100644 app/src/main/java/com/limelight/utils/NetHelper.java diff --git a/app/src/main/java/com/limelight/Game.java b/app/src/main/java/com/limelight/Game.java index 46ec1f2a..dfcc3a90 100644 --- a/app/src/main/java/com/limelight/Game.java +++ b/app/src/main/java/com/limelight/Game.java @@ -27,6 +27,7 @@ import com.limelight.preferences.PreferenceConfiguration; import com.limelight.ui.GameGestures; import com.limelight.ui.StreamView; import com.limelight.utils.Dialog; +import com.limelight.utils.NetHelper; import com.limelight.utils.ShortcutHelper; import com.limelight.utils.SpinnerDialog; import com.limelight.utils.UiHelper; @@ -428,6 +429,11 @@ public class Game extends Activity implements SurfaceHolder.Callback, } } + boolean vpnActive = NetHelper.isActiveNetworkVpn(this); + if (vpnActive) { + LimeLog.info("Detected active network is a VPN"); + } + StreamConfiguration config = new StreamConfiguration.Builder() .setResolution(prefConfig.width, prefConfig.height) .setRefreshRate(prefConfig.fps) @@ -435,8 +441,10 @@ public class Game extends Activity implements SurfaceHolder.Callback, .setBitrate(prefConfig.bitrate) .setEnableSops(prefConfig.enableSops) .enableLocalAudioPlayback(prefConfig.playHostAudio) - .setMaxPacketSize(1392) - .setRemoteConfiguration(StreamConfiguration.STREAM_CFG_AUTO) + .setMaxPacketSize(vpnActive ? 1024 : 1392) // Lower MTU on VPN + .setRemoteConfiguration(vpnActive ? // Use remote optimizations on VPN + StreamConfiguration.STREAM_CFG_REMOTE : + StreamConfiguration.STREAM_CFG_AUTO) .setHevcBitratePercentageMultiplier(75) .setHevcSupported(decoderRenderer.isHevcSupported()) .setEnableHdr(willStreamHdr) diff --git a/app/src/main/java/com/limelight/computers/ComputerManagerService.java b/app/src/main/java/com/limelight/computers/ComputerManagerService.java index d88e475c..829ca467 100644 --- a/app/src/main/java/com/limelight/computers/ComputerManagerService.java +++ b/app/src/main/java/com/limelight/computers/ComputerManagerService.java @@ -24,6 +24,7 @@ import com.limelight.nvstream.http.PairingManager; import com.limelight.nvstream.mdns.MdnsComputer; import com.limelight.nvstream.mdns.MdnsDiscoveryListener; import com.limelight.utils.CacheHelper; +import com.limelight.utils.NetHelper; import com.limelight.utils.ServerHelper; import android.app.Service; @@ -34,7 +35,6 @@ import android.content.ServiceConnection; import android.net.ConnectivityManager; import android.net.Network; import android.net.NetworkCapabilities; -import android.net.NetworkInfo; import android.os.Binder; import android.os.Build; import android.os.IBinder; @@ -303,31 +303,9 @@ public class ComputerManagerService extends Service { return false; } - private boolean isActiveNetworkVpn() { - ConnectivityManager connMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - Network activeNetwork = connMgr.getActiveNetwork(); - if (activeNetwork != null) { - NetworkCapabilities netCaps = connMgr.getNetworkCapabilities(activeNetwork); - if (netCaps != null) { - return netCaps.hasTransport(NetworkCapabilities.TRANSPORT_VPN) || - !netCaps.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VPN); - } - } - } - else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - NetworkInfo activeNetworkInfo = connMgr.getActiveNetworkInfo(); - if (activeNetworkInfo != null) { - return activeNetworkInfo.getType() == ConnectivityManager.TYPE_VPN; - } - } - - return false; - } - private void populateExternalAddress(ComputerDetails details) { boolean boundToNetwork = false; - boolean activeNetworkIsVpn = isActiveNetworkVpn(); + boolean activeNetworkIsVpn = NetHelper.isActiveNetworkVpn(this); ConnectivityManager connMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); // Check if we're currently connected to a VPN which may send our diff --git a/app/src/main/java/com/limelight/utils/NetHelper.java b/app/src/main/java/com/limelight/utils/NetHelper.java new file mode 100644 index 00000000..4a6d7dc0 --- /dev/null +++ b/app/src/main/java/com/limelight/utils/NetHelper.java @@ -0,0 +1,32 @@ +package com.limelight.utils; + +import android.content.Context; +import android.net.ConnectivityManager; +import android.net.Network; +import android.net.NetworkCapabilities; +import android.net.NetworkInfo; +import android.os.Build; + +public class NetHelper { + public static boolean isActiveNetworkVpn(Context context) { + ConnectivityManager connMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + Network activeNetwork = connMgr.getActiveNetwork(); + if (activeNetwork != null) { + NetworkCapabilities netCaps = connMgr.getNetworkCapabilities(activeNetwork); + if (netCaps != null) { + return netCaps.hasTransport(NetworkCapabilities.TRANSPORT_VPN) || + !netCaps.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VPN); + } + } + } + else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + NetworkInfo activeNetworkInfo = connMgr.getActiveNetworkInfo(); + if (activeNetworkInfo != null) { + return activeNetworkInfo.getType() == ConnectivityManager.TYPE_VPN; + } + } + + return false; + } +}