diff --git a/app/src/main/java/com/github/kr328/clash/BaseActivity.kt b/app/src/main/java/com/github/kr328/clash/BaseActivity.kt index 7614a3b..db17bf2 100644 --- a/app/src/main/java/com/github/kr328/clash/BaseActivity.kt +++ b/app/src/main/java/com/github/kr328/clash/BaseActivity.kt @@ -7,6 +7,7 @@ import android.content.ServiceConnection import android.os.Bundle import android.os.IBinder import androidx.appcompat.app.AppCompatActivity +import androidx.appcompat.widget.Toolbar import com.github.kr328.clash.core.event.* import com.github.kr328.clash.core.utils.Log import com.github.kr328.clash.service.ClashService @@ -99,6 +100,22 @@ abstract class BaseActivity : AppCompatActivity(), IClashEventObserver { super.onDestroy() } + override fun setSupportActionBar(toolbar: Toolbar?) { + super.setSupportActionBar(toolbar) + + supportActionBar?.setDisplayHomeAsUpEnabled(shouldDisplayHomeAsUpEnabled()) + } + + open fun shouldDisplayHomeAsUpEnabled(): Boolean { + return true + } + + override fun onSupportNavigateUp(): Boolean { + this.onBackPressed() + + return true + } + private val observerBinder = object : IClashEventObserver.Stub() { override fun onLogEvent(event: LogEvent?) = this@BaseActivity.onLogEvent(event) diff --git a/app/src/main/java/com/github/kr328/clash/MainActivity.kt b/app/src/main/java/com/github/kr328/clash/MainActivity.kt index b14d7ee..8800712 100644 --- a/app/src/main/java/com/github/kr328/clash/MainActivity.kt +++ b/app/src/main/java/com/github/kr328/clash/MainActivity.kt @@ -77,6 +77,10 @@ class MainActivity : BaseActivity() { } } + override fun shouldDisplayHomeAsUpEnabled(): Boolean { + return false + } + override fun onProcessEvent(event: ProcessEvent?) { runOnUiThread { if (event == lastEvent) diff --git a/app/src/main/java/com/github/kr328/clash/SettingProxyActivity.kt b/app/src/main/java/com/github/kr328/clash/SettingProxyActivity.kt index 4a5cd1a..65d2d78 100644 --- a/app/src/main/java/com/github/kr328/clash/SettingProxyActivity.kt +++ b/app/src/main/java/com/github/kr328/clash/SettingProxyActivity.kt @@ -13,6 +13,7 @@ class SettingProxyActivity : BaseActivity() { companion object { private const val KEY_BYPASS_PRIVATE_NETWORK = "key_vpn_setting_bypass_private_network" private const val KEY_IPV6_SUPPORT = "key_vpn_setting_ipv6_support" + private const val KEY_DNS_HIJACKING = "key_dns_hijacking" } @Keep @@ -29,11 +30,13 @@ class SettingProxyActivity : BaseActivity() { val ipv6 = settings.isIPv6Enabled val privateNetwork = settings.isBypassPrivateNetwork + val dnsHijacking = settings.isDnsHijackingEnabled requireActivity().runOnUiThread { findPreference(KEY_IPV6_SUPPORT)?.isChecked = ipv6 findPreference(KEY_BYPASS_PRIVATE_NETWORK)?.isChecked = privateNetwork + findPreference(KEY_DNS_HIJACKING)?.isChecked = dnsHijacking } } } @@ -49,6 +52,8 @@ class SettingProxyActivity : BaseActivity() { settings.isBypassPrivateNetwork = findPreference(KEY_BYPASS_PRIVATE_NETWORK)?.isChecked ?: true + settings.isDnsHijackingEnabled = + findPreference(KEY_DNS_HIJACKING)?.isChecked ?: true } } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 3deede7..fcd240b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -69,6 +69,8 @@ Bypass private network subnet IPv6 Support Routing IPv6 traffic + DNS Hijacking + Redirect ALL dns traffic to clash Global Allow all apps access vpn diff --git a/app/src/main/res/xml/setting_proxy.xml b/app/src/main/res/xml/setting_proxy.xml index cef26c4..12efeb1 100644 --- a/app/src/main/res/xml/setting_proxy.xml +++ b/app/src/main/res/xml/setting_proxy.xml @@ -9,6 +9,10 @@ android:key="key_vpn_setting_ipv6_support" android:title="@string/proxy_setting_vpn_setting_ipv6" android:summary="@string/proxy_setting_vpn_setting_ipv6_summary" /> + socket.setFileDescriptorsForSend(arrayOf(fd)) socket.outputStream.write(0) socket.outputStream.flush() output.writeInt(mtu) + output.writeInt(if ( dnsHijacking ) 1 else 0) output.writeInt(0x243) } } diff --git a/service/src/main/aidl/com/github/kr328/clash/service/IClashService.aidl b/service/src/main/aidl/com/github/kr328/clash/service/IClashService.aidl index 83712a0..be56221 100644 --- a/service/src/main/aidl/com/github/kr328/clash/service/IClashService.aidl +++ b/service/src/main/aidl/com/github/kr328/clash/service/IClashService.aidl @@ -19,7 +19,7 @@ interface IClashService { // Control void setSelectProxy(String proxy, String selected); - void startTunDevice(in ParcelFileDescriptor fd, int mtu); + void startTunDevice(in ParcelFileDescriptor fd, int mtu, boolean dnsHijacking); void stopTunDevice(); void start(); void stop(); diff --git a/service/src/main/aidl/com/github/kr328/clash/service/IClashSettingService.aidl b/service/src/main/aidl/com/github/kr328/clash/service/IClashSettingService.aidl index 31fc505..2670625 100644 --- a/service/src/main/aidl/com/github/kr328/clash/service/IClashSettingService.aidl +++ b/service/src/main/aidl/com/github/kr328/clash/service/IClashSettingService.aidl @@ -4,11 +4,13 @@ interface IClashSettingService { // Set void setIPv6Enabled(boolean enabled); void setBypassPrivateNetwork(boolean enabled); + void setDnsHijackingEnabled(boolean enabled); void setAccessControl(int mode, in String[] applications); // Get boolean isIPv6Enabled(); boolean isBypassPrivateNetwork(); + boolean isDnsHijackingEnabled(); String[] getAccessControlApps(); int getAccessControlMode(); } diff --git a/service/src/main/java/com/github/kr328/clash/service/ClashService.kt b/service/src/main/java/com/github/kr328/clash/service/ClashService.kt index d371f9e..3a3cb28 100644 --- a/service/src/main/java/com/github/kr328/clash/service/ClashService.kt +++ b/service/src/main/java/com/github/kr328/clash/service/ClashService.kt @@ -101,11 +101,11 @@ class ClashService : Service(), IClashEventObserver, ClashEventService.Master, clash.process.stop() } - override fun startTunDevice(fd: ParcelFileDescriptor, mtu: Int) { + override fun startTunDevice(fd: ParcelFileDescriptor, mtu: Int, dnsHijacking: Boolean) { try { notification.setVpn(true) - clash.startTunDevice(fd.fileDescriptor, mtu) + clash.startTunDevice(fd.fileDescriptor, mtu, dnsHijacking) } catch (e: Exception) { Log.e("Start tun failure", e) diff --git a/service/src/main/java/com/github/kr328/clash/service/ClashSettingService.kt b/service/src/main/java/com/github/kr328/clash/service/ClashSettingService.kt index dea5d84..22b6568 100644 --- a/service/src/main/java/com/github/kr328/clash/service/ClashSettingService.kt +++ b/service/src/main/java/com/github/kr328/clash/service/ClashSettingService.kt @@ -8,6 +8,7 @@ class ClashSettingService(context: Context): IClashSettingService.Stub() { const val KEY_ACCESS_CONTROL_MODE = "key_access_control_mode" const val KEY_ACCESS_CONTROL_APPS = "ley_access_control_apps" const val KEY_IPV6_ENABLED = "key_ipv6_enabled" + const val KEY_DNS_HIJACKING_ENABLED = "key_dns_hijacking_enabled" const val KEY_BYPASS_PRIVATE_NETWORK = "key_bypass_private_network" const val ACCESS_CONTROL_MODE_ALLOW_ALL = 0 @@ -34,6 +35,12 @@ class ClashSettingService(context: Context): IClashSettingService.Stub() { } } + override fun setDnsHijackingEnabled(enabled: Boolean) { + preference.edit { + putBoolean(KEY_DNS_HIJACKING_ENABLED, enabled) + } + } + override fun setBypassPrivateNetwork(enabled: Boolean) { preference.edit { putBoolean(KEY_BYPASS_PRIVATE_NETWORK, enabled) @@ -48,6 +55,10 @@ class ClashSettingService(context: Context): IClashSettingService.Stub() { return preference.getBoolean(KEY_IPV6_ENABLED, true) } + override fun isDnsHijackingEnabled(): Boolean { + return preference.getBoolean(KEY_DNS_HIJACKING_ENABLED, true) + } + override fun getAccessControlApps(): Array { return preference.getStringSet(KEY_ACCESS_CONTROL_APPS, emptySet())?.toTypedArray()!! } diff --git a/service/src/main/java/com/github/kr328/clash/service/TunService.kt b/service/src/main/java/com/github/kr328/clash/service/TunService.kt index 0540d9f..2c28946 100644 --- a/service/src/main/java/com/github/kr328/clash/service/TunService.kt +++ b/service/src/main/java/com/github/kr328/clash/service/TunService.kt @@ -112,7 +112,7 @@ class TunService : VpnService(), IClashEventObserver { } ProcessEvent.STARTED -> { start = false - clash.startTunDevice(fileDescriptor, VPN_MTU) + clash.startTunDevice(fileDescriptor, VPN_MTU, settings.isDnsHijackingEnabled) Log.i("STARTED") }