add back button on action bar & add dns hijacking option

This commit is contained in:
Kr328 committed 2019-12-08 23:40:24 +08:00
1 parent 8a2826c242
commit 24e1732091
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
}
}
}
+2
View File
@@ -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>
+4
View File
@@ -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"
+8
View File
@@ -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())
}
+12 -2
View File
@@ -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")
}