Use poll as default monitor method
This should improve compatibility on very broken devices.
This commit is contained in:
@@ -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")
|
||||||
|
|||||||
@@ -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()) ?: "")
|
||||||
handleProcess(ProcessBuilder("ip", "monitor", monitoredObject))
|
if (mode != Mode.Poll) {
|
||||||
if (destroyed) return@thread
|
if (mode != Mode.MonitorRoot) {
|
||||||
handleProcess(ProcessBuilder("su", "-c", "exec ip monitor $monitoredObject"))
|
// monitor may get rejected by SELinux enforcing
|
||||||
if (destroyed) return@thread
|
handleProcess(ProcessBuilder("ip", "monitor", monitoredObject))
|
||||||
Timber.w("Failed to set up monitor, switching to polling")
|
if (destroyed) return@thread
|
||||||
Timber.i(MonitorFailure())
|
}
|
||||||
|
handleProcess(ProcessBuilder("su", "-c", "exec ip monitor $monitoredObject"))
|
||||||
|
if (destroyed) return@thread
|
||||||
|
Timber.w("Failed to set up monitor, switching to polling")
|
||||||
|
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
|
||||||
|
|||||||
10
mobile/src/main/res/drawable/ic_hardware_device_hub.xml
Normal file
10
mobile/src/main/res/drawable/ic_hardware_device_hub.xml
Normal 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>
|
||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
Reference in New Issue
Block a user