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 36ea4f3..5d55efc 100644 --- a/app/src/main/java/com/github/kr328/clash/MainActivity.kt +++ b/app/src/main/java/com/github/kr328/clash/MainActivity.kt @@ -5,7 +5,10 @@ import android.content.Intent import android.net.VpnService import android.os.Bundle import android.view.View -import com.github.kr328.clash.core.event.* +import com.github.kr328.clash.core.event.BandwidthEvent +import com.github.kr328.clash.core.event.Event +import com.github.kr328.clash.core.event.ProcessEvent +import com.github.kr328.clash.core.event.ProfileChangedEvent import com.github.kr328.clash.core.utils.ByteFormatter import com.github.kr328.clash.service.TunService import kotlinx.android.synthetic.main.activity_main.* diff --git a/app/src/main/java/com/github/kr328/clash/MainApplication.kt b/app/src/main/java/com/github/kr328/clash/MainApplication.kt index 6f41eb5..14c5bb9 100644 --- a/app/src/main/java/com/github/kr328/clash/MainApplication.kt +++ b/app/src/main/java/com/github/kr328/clash/MainApplication.kt @@ -5,6 +5,12 @@ import com.github.kr328.clash.core.utils.Log import com.google.firebase.FirebaseApp class MainApplication : Application() { + companion object { + const val KEY_PROXY_MODE = "key_proxy_mode" + const val PROXY_MODE_VPN = "vpn" + const val PROXY_MODE_PROXY_ONLY = "proxy_only" + } + override fun onCreate() { super.onCreate() diff --git a/app/src/main/java/com/github/kr328/clash/ProxyActivity.kt b/app/src/main/java/com/github/kr328/clash/ProxyActivity.kt index 4e138d4..4533a26 100644 --- a/app/src/main/java/com/github/kr328/clash/ProxyActivity.kt +++ b/app/src/main/java/com/github/kr328/clash/ProxyActivity.kt @@ -3,7 +3,6 @@ package com.github.kr328.clash import android.os.Bundle import com.github.kr328.clash.adapter.ProxyAdapter import com.github.kr328.clash.core.model.ProxyPacket -import com.github.kr328.clash.core.utils.Log import com.github.kr328.clash.model.ListProxy import kotlinx.android.synthetic.main.activity_proxies.* 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 9af586d..8bb3da8 100644 --- a/app/src/main/java/com/github/kr328/clash/SettingProxyActivity.kt +++ b/app/src/main/java/com/github/kr328/clash/SettingProxyActivity.kt @@ -1,15 +1,50 @@ package com.github.kr328.clash +import android.content.Context import android.os.Bundle import android.view.View +import androidx.core.content.edit +import androidx.preference.CheckBoxPreference import androidx.preference.PreferenceFragmentCompat import kotlinx.android.synthetic.main.activity_setting_proxy.* 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" + } + class Fragment : PreferenceFragmentCompat() { override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { setPreferencesFromResource(R.xml.setting_proxy, rootKey) } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + (requireActivity() as SettingProxyActivity).runClash { + val settings = it.settingService + + val ipv6 = settings.isIPv6Enabled + val privateNetwork = settings.isBypassPrivateNetwork + + requireActivity().runOnUiThread { + findPreference(KEY_IPV6_SUPPORT)?.isChecked = ipv6 + findPreference(KEY_BYPASS_PRIVATE_NETWORK)?.isChecked = privateNetwork + } + } + } + + override fun onStop() { + super.onStop() + + (requireActivity() as SettingProxyActivity).runClash { + val settings = it.settingService + + settings.isIPv6Enabled = findPreference(KEY_IPV6_SUPPORT)?.isChecked ?: true + settings.isBypassPrivateNetwork = findPreference(KEY_BYPASS_PRIVATE_NETWORK)?.isChecked ?: true + } + } } override fun onCreate(savedInstanceState: Bundle?) { @@ -33,5 +68,27 @@ class SettingProxyActivity : BaseActivity() { activity_setting_proxy_divider.visibility = View.GONE activity_setting_proxy_content.visibility = View.GONE } + + getSharedPreferences("application", Context.MODE_PRIVATE).apply { + when ( getString(MainApplication.KEY_PROXY_MODE, MainApplication.PROXY_MODE_VPN) ) { + MainApplication.PROXY_MODE_VPN -> + activity_setting_proxy_vpn_mode.performClick() + MainApplication.PROXY_MODE_PROXY_ONLY -> + activity_setting_proxy_proxy_only_mode.performClick() + } + } + } + + override fun onStop() { + super.onStop() + + getSharedPreferences("application", Context.MODE_PRIVATE).edit { + when { + activity_setting_proxy_vpn_mode.isChecked -> + putString(MainApplication.KEY_PROXY_MODE, MainApplication.PROXY_MODE_VPN) + activity_setting_proxy_proxy_only_mode.isChecked -> + putString(MainApplication.KEY_PROXY_MODE, MainApplication.PROXY_MODE_PROXY_ONLY) + } + } } } \ No newline at end of file diff --git a/app/src/main/java/com/github/kr328/clash/adapter/ProxyAdapter.kt b/app/src/main/java/com/github/kr328/clash/adapter/ProxyAdapter.kt index 4672484..268148b 100644 --- a/app/src/main/java/com/github/kr328/clash/adapter/ProxyAdapter.kt +++ b/app/src/main/java/com/github/kr328/clash/adapter/ProxyAdapter.kt @@ -2,7 +2,6 @@ package com.github.kr328.clash.adapter import android.content.Context import android.graphics.Color -import android.graphics.drawable.GradientDrawable import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -13,7 +12,6 @@ import com.github.kr328.clash.R import com.github.kr328.clash.core.model.ProxyPacket import com.github.kr328.clash.model.ListProxy import com.google.android.material.card.MaterialCardView -import java.lang.IllegalArgumentException class ProxyAdapter(private val context: Context, val listener: (String, String) -> Unit) : RecyclerView.Adapter() { var elements: List = emptyList() @@ -90,13 +88,15 @@ class ProxyAdapter(private val context: Context, val listener: (String, String) holder.card.isFocusable = true holder.card.isClickable = true holder.card.setOnClickListener { - val old = current.header.now - current.header.now = position + val element = (elements[position] as ListProxy.ListProxyItem) + + val old = element.header.now + element.header.now = position notifyItemChanged(old) notifyItemChanged(position) - listener(current.header.name, current.name) + listener(element.header.name, element.name) } } else { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index aee3aa6..46693ec 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -55,6 +55,8 @@ VPN Settings Access Control Configure access permission for apps + Bypass Private Network + Bypass private network subnet IPv6 Support Routing IPv6 traffic diff --git a/app/src/main/res/xml/setting_proxy.xml b/app/src/main/res/xml/setting_proxy.xml index 2952819..50317d9 100644 --- a/app/src/main/res/xml/setting_proxy.xml +++ b/app/src/main/res/xml/setting_proxy.xml @@ -1,8 +1,12 @@ - + +