Update dependencies
This commit is contained in:
@@ -66,14 +66,13 @@ dependencies {
|
|||||||
implementation "androidx.core:core-ktx:1.0.1"
|
implementation "androidx.core:core-ktx:1.0.1"
|
||||||
implementation "androidx.lifecycle:lifecycle-extensions:$lifecycleVersion"
|
implementation "androidx.lifecycle:lifecycle-extensions:$lifecycleVersion"
|
||||||
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycleVersion"
|
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycleVersion"
|
||||||
implementation "androidx.preference:preference:1.0.0"
|
implementation "androidx.preference:preference:1.1.0-alpha02"
|
||||||
implementation "androidx.room:room-runtime:$roomVersion"
|
implementation "androidx.room:room-runtime:$roomVersion"
|
||||||
implementation 'com.github.luongvo:BadgeView:1.1.5'
|
implementation 'com.github.luongvo:BadgeView:1.1.5'
|
||||||
implementation 'com.github.topjohnwu:libsu:2.1.2'
|
implementation 'com.github.topjohnwu:libsu:2.1.2'
|
||||||
implementation "com.google.android.material:material:1.0.0"
|
implementation "com.google.android.material:material:1.0.0"
|
||||||
implementation 'com.jakewharton.timber:timber:4.7.1'
|
implementation 'com.jakewharton.timber:timber:4.7.1'
|
||||||
implementation 'com.linkedin.dexmaker:dexmaker-mockito:2.19.1'
|
implementation 'com.linkedin.dexmaker:dexmaker-mockito:2.19.1'
|
||||||
implementation 'com.takisoft.preferencex:preferencex:1.0.0'
|
|
||||||
implementation 'com.takisoft.preferencex:preferencex-simplemenu:1.0.0'
|
implementation 'com.takisoft.preferencex:preferencex-simplemenu:1.0.0'
|
||||||
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlinVersion"
|
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlinVersion"
|
||||||
baseImplementation 'com.android.billingclient:billing:1.2'
|
baseImplementation 'com.android.billingclient:billing:1.2'
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ abstract class AlertDialogFragment : DialogFragment(), DialogInterface.OnClickLi
|
|||||||
targetFragment?.onActivityResult(targetRequestCode, which, data)
|
targetFragment?.onActivityResult(targetRequestCode, which, data)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onDismiss(dialog: DialogInterface?) {
|
override fun onDismiss(dialog: DialogInterface) {
|
||||||
super.onDismiss(dialog)
|
super.onDismiss(dialog)
|
||||||
targetFragment?.onActivityResult(targetRequestCode, Activity.RESULT_CANCELED, null)
|
targetFragment?.onActivityResult(targetRequestCode, Activity.RESULT_CANCELED, null)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,8 +6,8 @@ import android.os.Build
|
|||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import androidx.core.content.FileProvider
|
import androidx.core.content.FileProvider
|
||||||
import androidx.core.net.toUri
|
import androidx.core.net.toUri
|
||||||
import androidx.core.os.bundleOf
|
|
||||||
import androidx.preference.Preference
|
import androidx.preference.Preference
|
||||||
|
import androidx.preference.PreferenceFragmentCompat
|
||||||
import androidx.preference.SwitchPreference
|
import androidx.preference.SwitchPreference
|
||||||
import be.mygod.vpnhotspot.App.Companion.app
|
import be.mygod.vpnhotspot.App.Companion.app
|
||||||
import be.mygod.vpnhotspot.net.Routing
|
import be.mygod.vpnhotspot.net.Routing
|
||||||
@@ -17,9 +17,9 @@ 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
|
||||||
|
import be.mygod.vpnhotspot.preference.SummaryFallbackProvider
|
||||||
import be.mygod.vpnhotspot.util.RootSession
|
import be.mygod.vpnhotspot.util.RootSession
|
||||||
import be.mygod.vpnhotspot.widget.SmartSnackbar
|
import be.mygod.vpnhotspot.widget.SmartSnackbar
|
||||||
import com.takisoft.preferencex.PreferenceFragmentCompat
|
|
||||||
import timber.log.Timber
|
import timber.log.Timber
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.io.IOException
|
import java.io.IOException
|
||||||
@@ -28,7 +28,7 @@ import java.net.NetworkInterface
|
|||||||
import java.net.SocketException
|
import java.net.SocketException
|
||||||
|
|
||||||
class SettingsPreferenceFragment : PreferenceFragmentCompat() {
|
class SettingsPreferenceFragment : PreferenceFragmentCompat() {
|
||||||
override fun onCreatePreferencesFix(savedInstanceState: Bundle?, rootKey: String?) {
|
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
|
||||||
preferenceManager.preferenceDataStore = SharedPreferenceDataStore(app.pref)
|
preferenceManager.preferenceDataStore = SharedPreferenceDataStore(app.pref)
|
||||||
addPreferencesFromResource(R.xml.pref_settings)
|
addPreferencesFromResource(R.xml.pref_settings)
|
||||||
val boot = findPreference("service.repeater.startOnBoot") as SwitchPreference
|
val boot = findPreference("service.repeater.startOnBoot") as SwitchPreference
|
||||||
@@ -39,7 +39,7 @@ class SettingsPreferenceFragment : PreferenceFragmentCompat() {
|
|||||||
}
|
}
|
||||||
boot.isChecked = BootReceiver.enabled
|
boot.isChecked = BootReceiver.enabled
|
||||||
} else boot.parent!!.removePreference(boot)
|
} else boot.parent!!.removePreference(boot)
|
||||||
findPreference("service.clean").setOnPreferenceClickListener {
|
findPreference<Preference>("service.clean").setOnPreferenceClickListener {
|
||||||
app.onPreCleanRoutings()
|
app.onPreCleanRoutings()
|
||||||
val cleaned = try {
|
val cleaned = try {
|
||||||
Routing.clean()
|
Routing.clean()
|
||||||
@@ -52,11 +52,12 @@ class SettingsPreferenceFragment : PreferenceFragmentCompat() {
|
|||||||
if (cleaned) app.onRoutingsCleaned()
|
if (cleaned) app.onRoutingsCleaned()
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
findPreference(IpMonitor.KEY).setOnPreferenceChangeListener { _, _ ->
|
SummaryFallbackProvider(findPreference(Routing.KEY_DNS))
|
||||||
|
findPreference<Preference>(IpMonitor.KEY).setOnPreferenceChangeListener { _, _ ->
|
||||||
SmartSnackbar.make(R.string.settings_restart_required).show()
|
SmartSnackbar.make(R.string.settings_restart_required).show()
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
findPreference("misc.logcat").setOnPreferenceClickListener {
|
findPreference<Preference>("misc.logcat").setOnPreferenceClickListener {
|
||||||
val context = requireContext()
|
val context = requireContext()
|
||||||
val logDir = File(context.cacheDir, "log")
|
val logDir = File(context.cacheDir, "log")
|
||||||
logDir.mkdir()
|
logDir.mkdir()
|
||||||
@@ -118,28 +119,31 @@ class SettingsPreferenceFragment : PreferenceFragmentCompat() {
|
|||||||
getString(R.string.abc_shareactionprovider_share_with)))
|
getString(R.string.abc_shareactionprovider_share_with)))
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
findPreference("misc.source").setOnPreferenceClickListener {
|
findPreference<Preference>("misc.source").setOnPreferenceClickListener {
|
||||||
(activity as MainActivity).launchUrl("https://github.com/Mygod/VPNHotspot/blob/master/README.md".toUri())
|
(activity as MainActivity).launchUrl("https://github.com/Mygod/VPNHotspot/blob/master/README.md".toUri())
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
findPreference("misc.donate").setOnPreferenceClickListener {
|
findPreference<Preference>("misc.donate").setOnPreferenceClickListener {
|
||||||
EBegFragment().show(fragmentManager ?: return@setOnPreferenceClickListener false, "EBegFragment")
|
EBegFragment().show(fragmentManager ?: return@setOnPreferenceClickListener false, "EBegFragment")
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onDisplayPreferenceDialog(preference: Preference) = when (preference.key) {
|
override fun onDisplayPreferenceDialog(preference: Preference) {
|
||||||
UpstreamMonitor.KEY, FallbackUpstreamMonitor.KEY -> displayPreferenceDialog(
|
when (preference.key) {
|
||||||
AlwaysAutoCompleteEditTextPreferenceDialogFragmentCompat(), preference.key,
|
UpstreamMonitor.KEY, FallbackUpstreamMonitor.KEY ->
|
||||||
bundleOf(Pair(AlwaysAutoCompleteEditTextPreferenceDialogFragmentCompat.KEY_SUGGESTIONS,
|
AlwaysAutoCompleteEditTextPreferenceDialogFragmentCompat().apply {
|
||||||
try {
|
setArguments(preference.key, try {
|
||||||
NetworkInterface.getNetworkInterfaces().asSequence()
|
NetworkInterface.getNetworkInterfaces().asSequence()
|
||||||
.filter { it.isUp && !it.isLoopback && it.interfaceAddresses.isNotEmpty() }
|
.filter { it.isUp && !it.isLoopback && it.interfaceAddresses.isNotEmpty() }
|
||||||
.map { it.name }.sorted().toList().toTypedArray()
|
.map { it.name }.sorted().toList().toTypedArray()
|
||||||
} catch (e: SocketException) {
|
} catch (e: SocketException) {
|
||||||
Timber.w(e)
|
Timber.w(e)
|
||||||
emptyArray<String>()
|
emptyArray<String>()
|
||||||
})))
|
})
|
||||||
else -> super.onDisplayPreferenceDialog(preference)
|
setTargetFragment(this@SettingsPreferenceFragment, 0)
|
||||||
|
}.show(fragmentManager ?: return, preference.key)
|
||||||
|
else -> super.onDisplayPreferenceDialog(preference)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -59,7 +59,7 @@ class ClientsFragment : Fragment() {
|
|||||||
|
|
||||||
override fun onClick(di: DialogInterface?, which: Int) {
|
override fun onClick(di: DialogInterface?, which: Int) {
|
||||||
AppDatabase.instance.clientRecordDao.lookup(mac.macToLong()).apply {
|
AppDatabase.instance.clientRecordDao.lookup(mac.macToLong()).apply {
|
||||||
nickname = dialog.findViewById<EditText>(android.R.id.edit).text
|
nickname = dialog!!.findViewById<EditText>(android.R.id.edit).text
|
||||||
AppDatabase.instance.clientRecordDao.update(this)
|
AppDatabase.instance.clientRecordDao.update(this)
|
||||||
}
|
}
|
||||||
IpNeighbourMonitor.instance?.flush()
|
IpNeighbourMonitor.instance?.flush()
|
||||||
|
|||||||
@@ -124,7 +124,7 @@ class RepeaterManager(private val parent: TetheringFragment) : Manager(), Servic
|
|||||||
setNeutralButton(R.string.repeater_wps_dialog_pbc, listener)
|
setNeutralButton(R.string.repeater_wps_dialog_pbc, listener)
|
||||||
}
|
}
|
||||||
override val data: Intent get() = Intent()
|
override val data: Intent get() = Intent()
|
||||||
.putExtra(KEY_PIN, dialog.findViewById<EditText>(android.R.id.edit)?.text?.toString())
|
.putExtra(KEY_PIN, dialog!!.findViewById<EditText>(android.R.id.edit)?.text?.toString())
|
||||||
|
|
||||||
override fun onCreateDialog(savedInstanceState: Bundle?) = super.onCreateDialog(savedInstanceState).apply {
|
override fun onCreateDialog(savedInstanceState: Bundle?) = super.onCreateDialog(savedInstanceState).apply {
|
||||||
window!!.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE)
|
window!!.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE)
|
||||||
|
|||||||
@@ -43,6 +43,7 @@ class Routing(val downstream: String, ownerAddress: InterfaceAddress? = null) :
|
|||||||
* Source: https://android.googlesource.com/platform/external/iptables/+/android-5.0.0_r1/iptables/iptables.c#1574
|
* Source: https://android.googlesource.com/platform/external/iptables/+/android-5.0.0_r1/iptables/iptables.c#1574
|
||||||
*/
|
*/
|
||||||
val IPTABLES = if (Build.VERSION.SDK_INT >= 26) "iptables -w 1" else "iptables -w"
|
val IPTABLES = if (Build.VERSION.SDK_INT >= 26) "iptables -w 1" else "iptables -w"
|
||||||
|
const val KEY_DNS = "service.dns"
|
||||||
|
|
||||||
fun clean() {
|
fun clean() {
|
||||||
TrafficRecorder.clean()
|
TrafficRecorder.clean()
|
||||||
@@ -212,7 +213,7 @@ class Routing(val downstream: String, ownerAddress: InterfaceAddress? = null) :
|
|||||||
private var currentDns: DnsRoute? = null
|
private var currentDns: DnsRoute? = null
|
||||||
private fun updateDnsRoute() {
|
private fun updateDnsRoute() {
|
||||||
var dns = (upstream.dns + fallbackUpstream.dns).firstOrNull { it is Inet4Address }?.hostAddress
|
var dns = (upstream.dns + fallbackUpstream.dns).firstOrNull { it is Inet4Address }?.hostAddress
|
||||||
?: app.pref.getString("service.dns", null)
|
?: app.pref.getString(KEY_DNS, null)
|
||||||
if (dns.isNullOrBlank()) dns = "8.8.8.8"
|
if (dns.isNullOrBlank()) dns = "8.8.8.8"
|
||||||
if (dns != currentDns?.dns) {
|
if (dns != currentDns?.dns) {
|
||||||
currentDns?.transaction?.revert()
|
currentDns?.transaction?.revert()
|
||||||
|
|||||||
@@ -61,9 +61,7 @@ class WifiP2pDialogFragment : AlertDialogFragment(), TextWatcher, DialogInterfac
|
|||||||
mPassword.addTextChangedListener(this@WifiP2pDialogFragment)
|
mPassword.addTextChangedListener(this@WifiP2pDialogFragment)
|
||||||
}
|
}
|
||||||
|
|
||||||
override val data get() = Intent().apply {
|
override val data get() = Intent().putExtra(KEY_CONFIGURATION, config)
|
||||||
putExtra(KEY_CONFIGURATION, config)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onStart() {
|
override fun onStart() {
|
||||||
super.onStart()
|
super.onStart()
|
||||||
|
|||||||
@@ -3,17 +3,18 @@ package be.mygod.vpnhotspot.preference
|
|||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.text.TextUtils
|
import android.text.TextUtils
|
||||||
import android.util.AttributeSet
|
import android.util.AttributeSet
|
||||||
|
import androidx.preference.EditTextPreference
|
||||||
import be.mygod.vpnhotspot.R
|
import be.mygod.vpnhotspot.R
|
||||||
import be.mygod.vpnhotspot.widget.AlwaysAutoCompleteEditText
|
import be.mygod.vpnhotspot.widget.AlwaysAutoCompleteEditText
|
||||||
import com.takisoft.preferencex.AutoSummaryEditTextPreference
|
|
||||||
|
|
||||||
open class AlwaysAutoCompleteEditTextPreference @JvmOverloads constructor(
|
open class AlwaysAutoCompleteEditTextPreference @JvmOverloads constructor(
|
||||||
context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = R.attr.editTextPreferenceStyle,
|
context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = R.attr.editTextPreferenceStyle,
|
||||||
defStyleRes: Int = 0) : AutoSummaryEditTextPreference(context, attrs, defStyleAttr, defStyleRes) {
|
defStyleRes: Int = 0) : EditTextPreference(context, attrs, defStyleAttr, defStyleRes) {
|
||||||
val editText = AlwaysAutoCompleteEditText(context, attrs)
|
val editText = AlwaysAutoCompleteEditText(context, attrs)
|
||||||
|
|
||||||
init {
|
init {
|
||||||
editText.id = android.R.id.edit
|
editText.id = android.R.id.edit
|
||||||
|
SummaryFallbackProvider(this)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun setText(text: String?) {
|
override fun setText(text: String?) {
|
||||||
|
|||||||
@@ -5,11 +5,16 @@ import android.view.ViewGroup
|
|||||||
import android.widget.ArrayAdapter
|
import android.widget.ArrayAdapter
|
||||||
import android.widget.EditText
|
import android.widget.EditText
|
||||||
import androidx.appcompat.widget.AppCompatAutoCompleteTextView
|
import androidx.appcompat.widget.AppCompatAutoCompleteTextView
|
||||||
|
import androidx.core.os.bundleOf
|
||||||
import androidx.preference.PreferenceDialogFragmentCompat
|
import androidx.preference.PreferenceDialogFragmentCompat
|
||||||
|
|
||||||
open class AlwaysAutoCompleteEditTextPreferenceDialogFragmentCompat : PreferenceDialogFragmentCompat() {
|
open class AlwaysAutoCompleteEditTextPreferenceDialogFragmentCompat : PreferenceDialogFragmentCompat() {
|
||||||
companion object {
|
companion object {
|
||||||
const val KEY_SUGGESTIONS = "suggestions"
|
private const val ARG_SUGGESTIONS = "suggestions"
|
||||||
|
}
|
||||||
|
|
||||||
|
fun setArguments(key: String, suggestions: Array<String>) {
|
||||||
|
arguments = bundleOf(Pair(ARG_KEY, key), Pair(ARG_SUGGESTIONS, suggestions))
|
||||||
}
|
}
|
||||||
|
|
||||||
private lateinit var editText: AppCompatAutoCompleteTextView
|
private lateinit var editText: AppCompatAutoCompleteTextView
|
||||||
@@ -19,12 +24,13 @@ open class AlwaysAutoCompleteEditTextPreferenceDialogFragmentCompat : Preference
|
|||||||
super.onBindDialogView(view)
|
super.onBindDialogView(view)
|
||||||
|
|
||||||
editText = editTextPreference.editText
|
editText = editTextPreference.editText
|
||||||
|
editText.hint = (editTextPreference.summaryProvider as SummaryFallbackProvider).fallback
|
||||||
editText.setText(this.editTextPreference.text)
|
editText.setText(this.editTextPreference.text)
|
||||||
|
|
||||||
val text = editText.text
|
val text = editText.text
|
||||||
if (text != null) editText.setSelection(text.length, text.length)
|
if (text != null) editText.setSelection(text.length, text.length)
|
||||||
|
|
||||||
val suggestions = arguments?.getStringArray(KEY_SUGGESTIONS)
|
val suggestions = arguments?.getStringArray(ARG_SUGGESTIONS)
|
||||||
if (suggestions != null)
|
if (suggestions != null)
|
||||||
editText.setAdapter(ArrayAdapter(view.context, android.R.layout.select_dialog_item, suggestions))
|
editText.setAdapter(ArrayAdapter(view.context, android.R.layout.select_dialog_item, suggestions))
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,15 @@
|
|||||||
|
package be.mygod.vpnhotspot.preference
|
||||||
|
|
||||||
|
import androidx.preference.EditTextPreference
|
||||||
|
import androidx.preference.Preference
|
||||||
|
|
||||||
|
class SummaryFallbackProvider(preference: Preference) : Preference.SummaryProvider<EditTextPreference> {
|
||||||
|
val fallback = preference.summary
|
||||||
|
init {
|
||||||
|
preference.summaryProvider = this
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun provideSummary(preference: EditTextPreference) = preference.text.let {
|
||||||
|
if (it.isNullOrEmpty()) fallback else it
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,91 +1,87 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
|
<PreferenceScreen xmlns:app="http://schemas.android.com/apk/res-auto">
|
||||||
<Preference
|
<Preference
|
||||||
android:key="service.clean"
|
app:key="service.clean"
|
||||||
android:icon="@drawable/ic_action_settings_backup_restore"
|
app:icon="@drawable/ic_action_settings_backup_restore"
|
||||||
android:title="@string/settings_service_clean"
|
app:title="@string/settings_service_clean"
|
||||||
android:summary="@string/settings_service_clean_summary"/>
|
app:summary="@string/settings_service_clean_summary"/>
|
||||||
<PreferenceCategory
|
<PreferenceCategory
|
||||||
android:title="@string/settings_upstream">
|
app:title="@string/settings_upstream">
|
||||||
<be.mygod.vpnhotspot.preference.AlwaysAutoCompleteEditTextPreference
|
<be.mygod.vpnhotspot.preference.AlwaysAutoCompleteEditTextPreference
|
||||||
android:key="service.upstream"
|
app:key="service.upstream"
|
||||||
android:icon="@drawable/ic_action_settings_ethernet"
|
app:icon="@drawable/ic_action_settings_ethernet"
|
||||||
android:title="@string/settings_service_upstream"
|
app:title="@string/settings_service_upstream"
|
||||||
android:summary="@string/settings_service_upstream_auto"
|
app:summary="@string/settings_service_upstream_auto"/>
|
||||||
android:hint="@string/settings_service_upstream_auto"
|
|
||||||
android:singleLine="true"/>
|
|
||||||
<be.mygod.vpnhotspot.preference.AlwaysAutoCompleteEditTextPreference
|
<be.mygod.vpnhotspot.preference.AlwaysAutoCompleteEditTextPreference
|
||||||
android:key="service.upstream.fallback"
|
app:key="service.upstream.fallback"
|
||||||
android:icon="@drawable/ic_action_settings_input_component"
|
app:icon="@drawable/ic_action_settings_input_component"
|
||||||
android:title="@string/settings_upstream_fallback"
|
app:title="@string/settings_upstream_fallback"
|
||||||
android:summary="@string/settings_upstream_fallback_auto"
|
app:summary="@string/settings_upstream_fallback_auto"/>
|
||||||
android:hint="@string/settings_upstream_fallback_auto"
|
|
||||||
android:singleLine="true"/>
|
|
||||||
<SwitchPreference
|
<SwitchPreference
|
||||||
android:key="service.masquerade"
|
app:key="service.masquerade"
|
||||||
android:icon="@drawable/ic_social_people"
|
app:icon="@drawable/ic_social_people"
|
||||||
android:title="@string/settings_service_masquerade"
|
app:title="@string/settings_service_masquerade"
|
||||||
android:summary="@string/settings_service_masquerade_summary"
|
app:summary="@string/settings_service_masquerade_summary"
|
||||||
android:defaultValue="true"/>
|
app:defaultValue="true"/>
|
||||||
</PreferenceCategory>
|
</PreferenceCategory>
|
||||||
<PreferenceCategory
|
<PreferenceCategory
|
||||||
android:title="@string/settings_downstream">
|
app:title="@string/settings_downstream">
|
||||||
<SwitchPreference
|
<SwitchPreference
|
||||||
android:key="service.disableIpv6"
|
app:key="service.disableIpv6"
|
||||||
android:icon="@drawable/ic_image_looks_6"
|
app:icon="@drawable/ic_image_looks_6"
|
||||||
android:title="@string/settings_service_disable_ipv6"
|
app:title="@string/settings_service_disable_ipv6"
|
||||||
android:summary="@string/settings_service_disable_ipv6_summary"/>
|
app:summary="@string/settings_service_disable_ipv6_summary"/>
|
||||||
<AutoSummaryEditTextPreference
|
<EditTextPreference
|
||||||
android:key="service.dns"
|
app:key="service.dns"
|
||||||
android:icon="@drawable/ic_action_dns"
|
app:icon="@drawable/ic_action_dns"
|
||||||
android:title="@string/settings_service_dns"
|
app:title="@string/settings_service_dns"
|
||||||
android:singleLine="true"
|
app:summary="8.8.8.8"
|
||||||
android:defaultValue="8.8.8.8"/>
|
app:defaultValue="8.8.8.8"/>
|
||||||
<SwitchPreference
|
<SwitchPreference
|
||||||
android:key="service.dhcpWorkaround"
|
app:key="service.dhcpWorkaround"
|
||||||
android:icon="@drawable/ic_action_build"
|
app:icon="@drawable/ic_action_build"
|
||||||
android:title="@string/settings_service_dhcp_workaround"
|
app:title="@string/settings_service_dhcp_workaround"
|
||||||
android:summary="@string/settings_service_dhcp_workaround_summary"/>
|
app:summary="@string/settings_service_dhcp_workaround_summary"/>
|
||||||
</PreferenceCategory>
|
</PreferenceCategory>
|
||||||
<PreferenceCategory
|
<PreferenceCategory
|
||||||
android:title="@string/settings_misc">
|
app:title="@string/settings_misc">
|
||||||
<SimpleMenuPreference
|
<com.takisoft.preferencex.SimpleMenuPreference
|
||||||
android:key="service.wifiLock"
|
app:key="service.wifiLock"
|
||||||
android:icon="@drawable/ic_device_wifi_lock"
|
app:icon="@drawable/ic_device_wifi_lock"
|
||||||
android:entries="@array/settings_service_wifi_lock"
|
app:entries="@array/settings_service_wifi_lock"
|
||||||
android:entryValues="@array/settings_service_wifi_lock_values"
|
app:entryValues="@array/settings_service_wifi_lock_values"
|
||||||
android:defaultValue="Full"
|
app:defaultValue="Full"
|
||||||
android:summary="%s"
|
app:summary="%s"
|
||||||
android:title="@string/settings_service_wifi_lock"/>
|
app:title="@string/settings_service_wifi_lock"/>
|
||||||
<SwitchPreference
|
<SwitchPreference
|
||||||
android:key="service.repeater.startOnBoot"
|
app:key="service.repeater.startOnBoot"
|
||||||
android:icon="@drawable/ic_action_autorenew"
|
app:icon="@drawable/ic_action_autorenew"
|
||||||
android:title="@string/settings_service_repeater_start_on_boot"/>
|
app:title="@string/settings_service_repeater_start_on_boot"/>
|
||||||
<SimpleMenuPreference
|
<com.takisoft.preferencex.SimpleMenuPreference
|
||||||
android:key="service.ipMonitor"
|
app:key="service.ipMonitor"
|
||||||
android:icon="@drawable/ic_hardware_device_hub"
|
app:icon="@drawable/ic_hardware_device_hub"
|
||||||
android:entries="@array/settings_service_ip_monitor"
|
app:entries="@array/settings_service_ip_monitor"
|
||||||
android:entryValues="@array/settings_service_ip_monitor_values"
|
app:entryValues="@array/settings_service_ip_monitor_values"
|
||||||
android:defaultValue="Poll"
|
app:defaultValue="Poll"
|
||||||
android:summary="%s"
|
app:summary="%s"
|
||||||
android:title="@string/settings_service_ip_monitor"/>
|
app:title="@string/settings_service_ip_monitor"/>
|
||||||
</PreferenceCategory>
|
</PreferenceCategory>
|
||||||
<PreferenceCategory
|
<PreferenceCategory
|
||||||
android:title="@string/settings_help">
|
app:title="@string/settings_help">
|
||||||
<Preference
|
<Preference
|
||||||
android:key="misc.source"
|
app:key="misc.source"
|
||||||
android:icon="@drawable/ic_toggle_star"
|
app:icon="@drawable/ic_toggle_star"
|
||||||
android:title="@string/settings_misc_source"
|
app:title="@string/settings_misc_source"
|
||||||
android:summary="@string/settings_misc_source_summary"/>
|
app:summary="@string/settings_misc_source_summary"/>
|
||||||
<Preference
|
<Preference
|
||||||
android:key="misc.logcat"
|
app:key="misc.logcat"
|
||||||
android:icon="@drawable/ic_action_bug_report"
|
app:icon="@drawable/ic_action_bug_report"
|
||||||
android:title="@string/settings_misc_logcat"
|
app:title="@string/settings_misc_logcat"
|
||||||
android:summary="@string/settings_misc_logcat_summary"/>
|
app:summary="@string/settings_misc_logcat_summary"/>
|
||||||
<Preference
|
<Preference
|
||||||
android:key="misc.donate"
|
app:key="misc.donate"
|
||||||
android:icon="@drawable/ic_action_card_giftcard"
|
app:icon="@drawable/ic_action_card_giftcard"
|
||||||
android:title="@string/settings_misc_donate"
|
app:title="@string/settings_misc_donate"
|
||||||
android:summary="@string/settings_misc_donate_summary"/>
|
app:summary="@string/settings_misc_donate_summary"/>
|
||||||
</PreferenceCategory>
|
</PreferenceCategory>
|
||||||
</PreferenceScreen>
|
</PreferenceScreen>
|
||||||
|
|||||||
Reference in New Issue
Block a user