add back button on action bar & add dns hijacking option
This commit is contained in:
13 files changed
+71
-7
No files matched your search
@@ -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)
|
||||
|
||||
@@ -77,6 +77,10 @@ class MainActivity : BaseActivity() {
|
||||
}
|
||||
}
|
||||
|
||||
override fun shouldDisplayHomeAsUpEnabled(): Boolean {
|
||||
return false
|
||||
}
|
||||
|
||||
override fun onProcessEvent(event: ProcessEvent?) {
|
||||
runOnUiThread {
|
||||
if (event == lastEvent)
|
||||
|
||||
@@ -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<CheckBoxPreference>(KEY_IPV6_SUPPORT)?.isChecked = ipv6
|
||||
findPreference<CheckBoxPreference>(KEY_BYPASS_PRIVATE_NETWORK)?.isChecked =
|
||||
privateNetwork
|
||||
findPreference<CheckBoxPreference>(KEY_DNS_HIJACKING)?.isChecked = dnsHijacking
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -49,6 +52,8 @@ class SettingProxyActivity : BaseActivity() {
|
||||
settings.isBypassPrivateNetwork =
|
||||
findPreference<CheckBoxPreference>(KEY_BYPASS_PRIVATE_NETWORK)?.isChecked
|
||||
?: true
|
||||
settings.isDnsHijackingEnabled =
|
||||
findPreference<CheckBoxPreference>(KEY_DNS_HIJACKING)?.isChecked ?: true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -69,6 +69,8 @@
|
||||
<string name="proxy_setting_vpn_setting_bypass_private_network_summary">Bypass private network subnet</string>
|
||||
<string name="proxy_setting_vpn_setting_ipv6">IPv6 Support</string>
|
||||
<string name="proxy_setting_vpn_setting_ipv6_summary">Routing IPv6 traffic</string>
|
||||
<string name="proxy_setting_vpn_setting_dns_hijacking">DNS Hijacking</string>
|
||||
<string name="proxy_setting_vpn_setting_dns_hijacking_summary">Redirect ALL dns traffic to clash</string>
|
||||
|
||||
<string name="access_setting_allow_all">Global</string>
|
||||
<string name="access_setting_allow_all_summary">Allow all apps access vpn</string>
|
||||
|
||||
@@ -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" />
|
||||
<CheckBoxPreference
|
||||
android:key="key_dns_hijacking"
|
||||
android:title="@string/proxy_setting_vpn_setting_dns_hijacking"
|
||||
android:summary="@string/proxy_setting_vpn_setting_dns_hijacking_summary" />
|
||||
<Preference
|
||||
android:layout="@layout/preference_proxy_item"
|
||||
android:title="@string/proxy_setting_vpn_setting_access_control"
|
||||
|
||||
@@ -35,9 +35,11 @@ func handleTunStart(client *net.UnixConn) {
|
||||
}
|
||||
|
||||
var mtu uint32
|
||||
var dns uint32
|
||||
var end uint32
|
||||
|
||||
binary.Read(client, binary.BigEndian, &mtu)
|
||||
binary.Read(client, binary.BigEndian, &dns)
|
||||
binary.Read(client, binary.BigEndian, &end)
|
||||
|
||||
if end != tunCommandEnd {
|
||||
@@ -45,6 +47,12 @@ func handleTunStart(client *net.UnixConn) {
|
||||
return
|
||||
}
|
||||
|
||||
if dns != 0 {
|
||||
tun.SetDnsHijacking(true)
|
||||
} else {
|
||||
tun.SetDnsHijacking(false)
|
||||
}
|
||||
|
||||
if err := tun.StartTunProxy(fds[0], int(mtu)); err != nil {
|
||||
log.Errorln("Open tun device failure" + err.Error())
|
||||
}
|
||||
|
||||
@@ -15,7 +15,8 @@ type handler struct {
|
||||
const dnsServerAddress = "172.19.0.2:53"
|
||||
|
||||
var (
|
||||
instance *handler
|
||||
dnsHijacking bool = false
|
||||
instance *handler
|
||||
)
|
||||
|
||||
// StartTunProxy - start
|
||||
@@ -51,5 +52,14 @@ func ResetDnsRedirect() {
|
||||
return
|
||||
}
|
||||
|
||||
(*instance.tunAdapter).ReCreateDNSServer(dns.DefaultResolver, dnsServerAddress)
|
||||
if dnsHijacking {
|
||||
(*instance.tunAdapter).ReCreateDNSServer(dns.DefaultResolver, "0.0.0.0:53")
|
||||
} else {
|
||||
(*instance.tunAdapter).ReCreateDNSServer(dns.DefaultResolver, dnsServerAddress)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func SetDnsHijacking(enabled bool) {
|
||||
dnsHijacking = false
|
||||
}
|
||||
@@ -177,12 +177,13 @@ class Clash(
|
||||
Log.i("Url test exited")
|
||||
}
|
||||
|
||||
fun startTunDevice(fd: FileDescriptor, mtu: Int) {
|
||||
fun startTunDevice(fd: FileDescriptor, mtu: Int, dnsHijacking: Boolean) {
|
||||
runControl(COMMAND_TUN_START) { socket, _, output ->
|
||||
socket.setFileDescriptorsForSend(arrayOf(fd))
|
||||
socket.outputStream.write(0)
|
||||
socket.outputStream.flush()
|
||||
output.writeInt(mtu)
|
||||
output.writeInt(if ( dnsHijacking ) 1 else 0)
|
||||
output.writeInt(0x243)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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<String> {
|
||||
return preference.getStringSet(KEY_ACCESS_CONTROL_APPS, emptySet())?.toTypedArray()!!
|
||||
}
|
||||
|
||||
@@ -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")
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user