Use poll as default monitor method

This should improve compatibility on very broken devices.
This commit is contained in:
Mygod
2018-12-26 10:58:14 +08:00
parent 2fa91711ed
commit e8f993944c
7 changed files with 64 additions and 7 deletions

View File

@@ -14,6 +14,7 @@ import be.mygod.vpnhotspot.App.Companion.app
import be.mygod.vpnhotspot.net.Routing import be.mygod.vpnhotspot.net.Routing
import be.mygod.vpnhotspot.net.Routing.Companion.IPTABLES import be.mygod.vpnhotspot.net.Routing.Companion.IPTABLES
import be.mygod.vpnhotspot.net.monitor.FallbackUpstreamMonitor import be.mygod.vpnhotspot.net.monitor.FallbackUpstreamMonitor
import be.mygod.vpnhotspot.net.monitor.IpMonitor
import be.mygod.vpnhotspot.net.monitor.UpstreamMonitor import be.mygod.vpnhotspot.net.monitor.UpstreamMonitor
import be.mygod.vpnhotspot.preference.AlwaysAutoCompleteEditTextPreferenceDialogFragmentCompat import be.mygod.vpnhotspot.preference.AlwaysAutoCompleteEditTextPreferenceDialogFragmentCompat
import be.mygod.vpnhotspot.preference.SharedPreferenceDataStore import be.mygod.vpnhotspot.preference.SharedPreferenceDataStore
@@ -52,6 +53,10 @@ class SettingsPreferenceFragment : PreferenceFragmentCompat() {
if (cleaned) app.onRoutingsCleaned() if (cleaned) app.onRoutingsCleaned()
true true
} }
findPreference(IpMonitor.KEY).setOnPreferenceChangeListener { _, _ ->
SmartSnackbar.make(R.string.settings_restart_required).show()
true
}
findPreference("misc.logcat").setOnPreferenceClickListener { findPreference("misc.logcat").setOnPreferenceClickListener {
val context = requireContext() val context = requireContext()
val logDir = File(context.cacheDir, "log") val logDir = File(context.cacheDir, "log")

View File

@@ -1,5 +1,6 @@
package be.mygod.vpnhotspot.net.monitor package be.mygod.vpnhotspot.net.monitor
import be.mygod.vpnhotspot.App.Companion.app
import be.mygod.vpnhotspot.R import be.mygod.vpnhotspot.R
import be.mygod.vpnhotspot.debugLog import be.mygod.vpnhotspot.debugLog
import be.mygod.vpnhotspot.util.thread import be.mygod.vpnhotspot.util.thread
@@ -12,6 +13,14 @@ import java.util.concurrent.ScheduledExecutorService
import java.util.concurrent.TimeUnit import java.util.concurrent.TimeUnit
abstract class IpMonitor : Runnable { abstract class IpMonitor : Runnable {
companion object {
const val KEY = "service.ipMonitor"
}
enum class Mode {
Monitor, MonitorRoot, Poll
}
private class MonitorFailure : RuntimeException() private class MonitorFailure : RuntimeException()
private class FlushFailure : RuntimeException() private class FlushFailure : RuntimeException()
protected abstract val monitoredObject: String protected abstract val monitoredObject: String
@@ -50,13 +59,18 @@ abstract class IpMonitor : Runnable {
init { init {
thread("${javaClass.simpleName}-input") { thread("${javaClass.simpleName}-input") {
// monitor may get rejected by SELinux val mode = Mode.valueOf(app.pref.getString(KEY, Mode.Monitor.toString()) ?: "")
if (mode != Mode.Poll) {
if (mode != Mode.MonitorRoot) {
// monitor may get rejected by SELinux enforcing
handleProcess(ProcessBuilder("ip", "monitor", monitoredObject)) handleProcess(ProcessBuilder("ip", "monitor", monitoredObject))
if (destroyed) return@thread if (destroyed) return@thread
}
handleProcess(ProcessBuilder("su", "-c", "exec ip monitor $monitoredObject")) handleProcess(ProcessBuilder("su", "-c", "exec ip monitor $monitoredObject"))
if (destroyed) return@thread if (destroyed) return@thread
Timber.w("Failed to set up monitor, switching to polling") Timber.w("Failed to set up monitor, switching to polling")
Timber.i(MonitorFailure()) Timber.i(MonitorFailure())
}
val pool = Executors.newScheduledThreadPool(1) val pool = Executors.newScheduledThreadPool(1)
pool.scheduleAtFixedRate(this, 1, 1, TimeUnit.SECONDS) pool.scheduleAtFixedRate(this, 1, 1, TimeUnit.SECONDS)
this.pool = pool this.pool = pool

View File

@@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="#FF000000"
android:pathData="M17,16l-4,-4V8.82C14.16,8.4 15,7.3 15,6c0,-1.66 -1.34,-3 -3,-3S9,4.34 9,6c0,1.3 0.84,2.4 2,2.82V12l-4,4H3v5h5v-3.05l4,-4.2 4,4.2V21h5v-5h-4z"/>
</vector>

View File

@@ -88,6 +88,10 @@
<string name="settings_service_wifi_lock_none">系统默认</string> <string name="settings_service_wifi_lock_none">系统默认</string>
<string name="settings_service_wifi_lock_full">开(防止服务自动关闭)</string> <string name="settings_service_wifi_lock_full">开(防止服务自动关闭)</string>
<string name="settings_service_wifi_lock_high_perf">高性能模式(更快消耗电池)</string> <string name="settings_service_wifi_lock_high_perf">高性能模式(更快消耗电池)</string>
<string name="settings_service_ip_monitor">网络状态监听模式</string>
<string name="settings_service_ip_monitor_monitor">Netlink 监听</string>
<string name="settings_service_ip_monitor_monitor_root">Netlink 监听 (root)</string>
<string name="settings_service_ip_monitor_poll">轮询</string>
<string name="settings_service_dns">备用 DNS 服务器[:端口]</string> <string name="settings_service_dns">备用 DNS 服务器[:端口]</string>
<string name="settings_service_upstream">上游网络接口</string> <string name="settings_service_upstream">上游网络接口</string>
<string name="settings_service_upstream_auto">自动检测系统 VPN</string> <string name="settings_service_upstream_auto">自动检测系统 VPN</string>
@@ -105,6 +109,7 @@
<string name="settings_misc_donate">捐款</string> <string name="settings_misc_donate">捐款</string>
<string name="settings_misc_donate_summary">请给我钱</string> <string name="settings_misc_donate_summary">请给我钱</string>
<string name="settings_misc_donate_more">PayPal, Flattr 等其他方式…</string> <string name="settings_misc_donate_more">PayPal, Flattr 等其他方式…</string>
<string name="settings_restart_required">重启应用以应用新的设置。</string>
<string name="notification_tethering_title">VPN 共享已启用</string> <string name="notification_tethering_title">VPN 共享已启用</string>
<string name="notification_channel_tethering">VPN 共享服务</string> <string name="notification_channel_tethering">VPN 共享服务</string>

View File

@@ -10,4 +10,14 @@
<item>Full</item> <item>Full</item>
<item>HighPerf</item> <item>HighPerf</item>
</string-array> </string-array>
<string-array name="settings_service_ip_monitor">
<item>@string/settings_service_ip_monitor_monitor</item>
<item>@string/settings_service_ip_monitor_monitor_root</item>
<item>@string/settings_service_ip_monitor_poll</item>
</string-array>
<string-array name="settings_service_ip_monitor_values">
<item>Monitor</item>
<item>MonitorRoot</item>
<item>Poll</item>
</string-array>
</resources> </resources>

View File

@@ -96,6 +96,10 @@
<string name="settings_service_wifi_lock_none">System default</string> <string name="settings_service_wifi_lock_none">System default</string>
<string name="settings_service_wifi_lock_full">On (prevents service auto-shutdowns)</string> <string name="settings_service_wifi_lock_full">On (prevents service auto-shutdowns)</string>
<string name="settings_service_wifi_lock_high_perf">High Performance Mode (consumes more power)</string> <string name="settings_service_wifi_lock_high_perf">High Performance Mode (consumes more power)</string>
<string name="settings_service_ip_monitor">Network status monitor mode</string>
<string name="settings_service_ip_monitor_monitor">Netlink monitor</string>
<string name="settings_service_ip_monitor_monitor_root">Netlink monitor with root</string>
<string name="settings_service_ip_monitor_poll">Poll</string>
<string name="settings_service_dns">Fallback DNS server[:port]</string> <string name="settings_service_dns">Fallback DNS server[:port]</string>
<string name="settings_service_upstream">Upstream network interface</string> <string name="settings_service_upstream">Upstream network interface</string>
<string name="settings_service_upstream_auto">Auto detect system VPN</string> <string name="settings_service_upstream_auto">Auto detect system VPN</string>
@@ -114,6 +118,7 @@
<string name="settings_misc_donate">Donate</string> <string name="settings_misc_donate">Donate</string>
<string name="settings_misc_donate_summary">I love money</string> <string name="settings_misc_donate_summary">I love money</string>
<string name="settings_misc_donate_more">PayPal, Flattr, more…</string> <string name="settings_misc_donate_more">PayPal, Flattr, more…</string>
<string name="settings_restart_required">Restart this app to apply this setting.</string>
<string name="notification_tethering_title">VPN tethering active</string> <string name="notification_tethering_title">VPN tethering active</string>
<string name="notification_channel_tethering">VPN Tethering Service</string> <string name="notification_channel_tethering">VPN Tethering Service</string>

View File

@@ -61,6 +61,14 @@
android:key="service.repeater.startOnBoot" android:key="service.repeater.startOnBoot"
android:icon="@drawable/ic_action_autorenew" android:icon="@drawable/ic_action_autorenew"
android:title="@string/settings_service_repeater_start_on_boot"/> android:title="@string/settings_service_repeater_start_on_boot"/>
<SimpleMenuPreference
android:key="service.ipMonitor"
android:icon="@drawable/ic_hardware_device_hub"
android:entries="@array/settings_service_ip_monitor"
android:entryValues="@array/settings_service_ip_monitor_values"
android:defaultValue="Poll"
android:summary="%s"
android:title="@string/settings_service_ip_monitor"/>
<Preference <Preference
android:key="misc.logcat" android:key="misc.logcat"
android:icon="@drawable/ic_action_bug_report" android:icon="@drawable/ic_action_bug_report"