Update dependencies

This commit is contained in:
Mygod
2019-01-03 23:22:28 +08:00
parent 32c5973cdc
commit b00791d644
11 changed files with 125 additions and 105 deletions

View File

@@ -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'

View File

@@ -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)
} }

View File

@@ -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)
}
} }
} }

View File

@@ -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()

View File

@@ -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)

View File

@@ -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()

View File

@@ -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()

View File

@@ -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?) {

View File

@@ -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))

View File

@@ -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
}
}

View File

@@ -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>