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.lifecycle:lifecycle-extensions:$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 'com.github.luongvo:BadgeView:1.1.5'
implementation 'com.github.topjohnwu:libsu:2.1.2'
implementation "com.google.android.material:material:1.0.0"
implementation 'com.jakewharton.timber:timber:4.7.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 "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlinVersion"
baseImplementation 'com.android.billingclient:billing:1.2'

View File

@@ -25,7 +25,7 @@ abstract class AlertDialogFragment : DialogFragment(), DialogInterface.OnClickLi
targetFragment?.onActivityResult(targetRequestCode, which, data)
}
override fun onDismiss(dialog: DialogInterface?) {
override fun onDismiss(dialog: DialogInterface) {
super.onDismiss(dialog)
targetFragment?.onActivityResult(targetRequestCode, Activity.RESULT_CANCELED, null)
}

View File

@@ -6,8 +6,8 @@ import android.os.Build
import android.os.Bundle
import androidx.core.content.FileProvider
import androidx.core.net.toUri
import androidx.core.os.bundleOf
import androidx.preference.Preference
import androidx.preference.PreferenceFragmentCompat
import androidx.preference.SwitchPreference
import be.mygod.vpnhotspot.App.Companion.app
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.preference.AlwaysAutoCompleteEditTextPreferenceDialogFragmentCompat
import be.mygod.vpnhotspot.preference.SharedPreferenceDataStore
import be.mygod.vpnhotspot.preference.SummaryFallbackProvider
import be.mygod.vpnhotspot.util.RootSession
import be.mygod.vpnhotspot.widget.SmartSnackbar
import com.takisoft.preferencex.PreferenceFragmentCompat
import timber.log.Timber
import java.io.File
import java.io.IOException
@@ -28,7 +28,7 @@ import java.net.NetworkInterface
import java.net.SocketException
class SettingsPreferenceFragment : PreferenceFragmentCompat() {
override fun onCreatePreferencesFix(savedInstanceState: Bundle?, rootKey: String?) {
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
preferenceManager.preferenceDataStore = SharedPreferenceDataStore(app.pref)
addPreferencesFromResource(R.xml.pref_settings)
val boot = findPreference("service.repeater.startOnBoot") as SwitchPreference
@@ -39,7 +39,7 @@ class SettingsPreferenceFragment : PreferenceFragmentCompat() {
}
boot.isChecked = BootReceiver.enabled
} else boot.parent!!.removePreference(boot)
findPreference("service.clean").setOnPreferenceClickListener {
findPreference<Preference>("service.clean").setOnPreferenceClickListener {
app.onPreCleanRoutings()
val cleaned = try {
Routing.clean()
@@ -52,11 +52,12 @@ class SettingsPreferenceFragment : PreferenceFragmentCompat() {
if (cleaned) app.onRoutingsCleaned()
true
}
findPreference(IpMonitor.KEY).setOnPreferenceChangeListener { _, _ ->
SummaryFallbackProvider(findPreference(Routing.KEY_DNS))
findPreference<Preference>(IpMonitor.KEY).setOnPreferenceChangeListener { _, _ ->
SmartSnackbar.make(R.string.settings_restart_required).show()
true
}
findPreference("misc.logcat").setOnPreferenceClickListener {
findPreference<Preference>("misc.logcat").setOnPreferenceClickListener {
val context = requireContext()
val logDir = File(context.cacheDir, "log")
logDir.mkdir()
@@ -118,28 +119,31 @@ class SettingsPreferenceFragment : PreferenceFragmentCompat() {
getString(R.string.abc_shareactionprovider_share_with)))
true
}
findPreference("misc.source").setOnPreferenceClickListener {
findPreference<Preference>("misc.source").setOnPreferenceClickListener {
(activity as MainActivity).launchUrl("https://github.com/Mygod/VPNHotspot/blob/master/README.md".toUri())
true
}
findPreference("misc.donate").setOnPreferenceClickListener {
findPreference<Preference>("misc.donate").setOnPreferenceClickListener {
EBegFragment().show(fragmentManager ?: return@setOnPreferenceClickListener false, "EBegFragment")
true
}
}
override fun onDisplayPreferenceDialog(preference: Preference) = when (preference.key) {
UpstreamMonitor.KEY, FallbackUpstreamMonitor.KEY -> displayPreferenceDialog(
AlwaysAutoCompleteEditTextPreferenceDialogFragmentCompat(), preference.key,
bundleOf(Pair(AlwaysAutoCompleteEditTextPreferenceDialogFragmentCompat.KEY_SUGGESTIONS,
try {
NetworkInterface.getNetworkInterfaces().asSequence()
.filter { it.isUp && !it.isLoopback && it.interfaceAddresses.isNotEmpty() }
.map { it.name }.sorted().toList().toTypedArray()
} catch (e: SocketException) {
Timber.w(e)
emptyArray<String>()
})))
else -> super.onDisplayPreferenceDialog(preference)
override fun onDisplayPreferenceDialog(preference: Preference) {
when (preference.key) {
UpstreamMonitor.KEY, FallbackUpstreamMonitor.KEY ->
AlwaysAutoCompleteEditTextPreferenceDialogFragmentCompat().apply {
setArguments(preference.key, try {
NetworkInterface.getNetworkInterfaces().asSequence()
.filter { it.isUp && !it.isLoopback && it.interfaceAddresses.isNotEmpty() }
.map { it.name }.sorted().toList().toTypedArray()
} catch (e: SocketException) {
Timber.w(e)
emptyArray<String>()
})
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) {
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)
}
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)
}
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 {
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
*/
val IPTABLES = if (Build.VERSION.SDK_INT >= 26) "iptables -w 1" else "iptables -w"
const val KEY_DNS = "service.dns"
fun clean() {
TrafficRecorder.clean()
@@ -212,7 +213,7 @@ class Routing(val downstream: String, ownerAddress: InterfaceAddress? = null) :
private var currentDns: DnsRoute? = null
private fun updateDnsRoute() {
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 != currentDns?.dns) {
currentDns?.transaction?.revert()

View File

@@ -61,9 +61,7 @@ class WifiP2pDialogFragment : AlertDialogFragment(), TextWatcher, DialogInterfac
mPassword.addTextChangedListener(this@WifiP2pDialogFragment)
}
override val data get() = Intent().apply {
putExtra(KEY_CONFIGURATION, config)
}
override val data get() = Intent().putExtra(KEY_CONFIGURATION, config)
override fun onStart() {
super.onStart()

View File

@@ -3,17 +3,18 @@ package be.mygod.vpnhotspot.preference
import android.content.Context
import android.text.TextUtils
import android.util.AttributeSet
import androidx.preference.EditTextPreference
import be.mygod.vpnhotspot.R
import be.mygod.vpnhotspot.widget.AlwaysAutoCompleteEditText
import com.takisoft.preferencex.AutoSummaryEditTextPreference
open class AlwaysAutoCompleteEditTextPreference @JvmOverloads constructor(
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)
init {
editText.id = android.R.id.edit
SummaryFallbackProvider(this)
}
override fun setText(text: String?) {

View File

@@ -5,11 +5,16 @@ import android.view.ViewGroup
import android.widget.ArrayAdapter
import android.widget.EditText
import androidx.appcompat.widget.AppCompatAutoCompleteTextView
import androidx.core.os.bundleOf
import androidx.preference.PreferenceDialogFragmentCompat
open class AlwaysAutoCompleteEditTextPreferenceDialogFragmentCompat : PreferenceDialogFragmentCompat() {
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
@@ -19,12 +24,13 @@ open class AlwaysAutoCompleteEditTextPreferenceDialogFragmentCompat : Preference
super.onBindDialogView(view)
editText = editTextPreference.editText
editText.hint = (editTextPreference.summaryProvider as SummaryFallbackProvider).fallback
editText.setText(this.editTextPreference.text)
val text = editText.text
if (text != null) editText.setSelection(text.length, text.length)
val suggestions = arguments?.getStringArray(KEY_SUGGESTIONS)
val suggestions = arguments?.getStringArray(ARG_SUGGESTIONS)
if (suggestions != null)
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"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceScreen xmlns:app="http://schemas.android.com/apk/res-auto">
<Preference
android:key="service.clean"
android:icon="@drawable/ic_action_settings_backup_restore"
android:title="@string/settings_service_clean"
android:summary="@string/settings_service_clean_summary"/>
app:key="service.clean"
app:icon="@drawable/ic_action_settings_backup_restore"
app:title="@string/settings_service_clean"
app:summary="@string/settings_service_clean_summary"/>
<PreferenceCategory
android:title="@string/settings_upstream">
app:title="@string/settings_upstream">
<be.mygod.vpnhotspot.preference.AlwaysAutoCompleteEditTextPreference
android:key="service.upstream"
android:icon="@drawable/ic_action_settings_ethernet"
android:title="@string/settings_service_upstream"
android:summary="@string/settings_service_upstream_auto"
android:hint="@string/settings_service_upstream_auto"
android:singleLine="true"/>
app:key="service.upstream"
app:icon="@drawable/ic_action_settings_ethernet"
app:title="@string/settings_service_upstream"
app:summary="@string/settings_service_upstream_auto"/>
<be.mygod.vpnhotspot.preference.AlwaysAutoCompleteEditTextPreference
android:key="service.upstream.fallback"
android:icon="@drawable/ic_action_settings_input_component"
android:title="@string/settings_upstream_fallback"
android:summary="@string/settings_upstream_fallback_auto"
android:hint="@string/settings_upstream_fallback_auto"
android:singleLine="true"/>
app:key="service.upstream.fallback"
app:icon="@drawable/ic_action_settings_input_component"
app:title="@string/settings_upstream_fallback"
app:summary="@string/settings_upstream_fallback_auto"/>
<SwitchPreference
android:key="service.masquerade"
android:icon="@drawable/ic_social_people"
android:title="@string/settings_service_masquerade"
android:summary="@string/settings_service_masquerade_summary"
android:defaultValue="true"/>
app:key="service.masquerade"
app:icon="@drawable/ic_social_people"
app:title="@string/settings_service_masquerade"
app:summary="@string/settings_service_masquerade_summary"
app:defaultValue="true"/>
</PreferenceCategory>
<PreferenceCategory
android:title="@string/settings_downstream">
app:title="@string/settings_downstream">
<SwitchPreference
android:key="service.disableIpv6"
android:icon="@drawable/ic_image_looks_6"
android:title="@string/settings_service_disable_ipv6"
android:summary="@string/settings_service_disable_ipv6_summary"/>
<AutoSummaryEditTextPreference
android:key="service.dns"
android:icon="@drawable/ic_action_dns"
android:title="@string/settings_service_dns"
android:singleLine="true"
android:defaultValue="8.8.8.8"/>
app:key="service.disableIpv6"
app:icon="@drawable/ic_image_looks_6"
app:title="@string/settings_service_disable_ipv6"
app:summary="@string/settings_service_disable_ipv6_summary"/>
<EditTextPreference
app:key="service.dns"
app:icon="@drawable/ic_action_dns"
app:title="@string/settings_service_dns"
app:summary="8.8.8.8"
app:defaultValue="8.8.8.8"/>
<SwitchPreference
android:key="service.dhcpWorkaround"
android:icon="@drawable/ic_action_build"
android:title="@string/settings_service_dhcp_workaround"
android:summary="@string/settings_service_dhcp_workaround_summary"/>
app:key="service.dhcpWorkaround"
app:icon="@drawable/ic_action_build"
app:title="@string/settings_service_dhcp_workaround"
app:summary="@string/settings_service_dhcp_workaround_summary"/>
</PreferenceCategory>
<PreferenceCategory
android:title="@string/settings_misc">
<SimpleMenuPreference
android:key="service.wifiLock"
android:icon="@drawable/ic_device_wifi_lock"
android:entries="@array/settings_service_wifi_lock"
android:entryValues="@array/settings_service_wifi_lock_values"
android:defaultValue="Full"
android:summary="%s"
android:title="@string/settings_service_wifi_lock"/>
app:title="@string/settings_misc">
<com.takisoft.preferencex.SimpleMenuPreference
app:key="service.wifiLock"
app:icon="@drawable/ic_device_wifi_lock"
app:entries="@array/settings_service_wifi_lock"
app:entryValues="@array/settings_service_wifi_lock_values"
app:defaultValue="Full"
app:summary="%s"
app:title="@string/settings_service_wifi_lock"/>
<SwitchPreference
android:key="service.repeater.startOnBoot"
android:icon="@drawable/ic_action_autorenew"
android:title="@string/settings_service_repeater_start_on_boot"/>
<SimpleMenuPreference
android:key="service.ipMonitor"
android:icon="@drawable/ic_hardware_device_hub"
android:entries="@array/settings_service_ip_monitor"
android:entryValues="@array/settings_service_ip_monitor_values"
android:defaultValue="Poll"
android:summary="%s"
android:title="@string/settings_service_ip_monitor"/>
app:key="service.repeater.startOnBoot"
app:icon="@drawable/ic_action_autorenew"
app:title="@string/settings_service_repeater_start_on_boot"/>
<com.takisoft.preferencex.SimpleMenuPreference
app:key="service.ipMonitor"
app:icon="@drawable/ic_hardware_device_hub"
app:entries="@array/settings_service_ip_monitor"
app:entryValues="@array/settings_service_ip_monitor_values"
app:defaultValue="Poll"
app:summary="%s"
app:title="@string/settings_service_ip_monitor"/>
</PreferenceCategory>
<PreferenceCategory
android:title="@string/settings_help">
app:title="@string/settings_help">
<Preference
android:key="misc.source"
android:icon="@drawable/ic_toggle_star"
android:title="@string/settings_misc_source"
android:summary="@string/settings_misc_source_summary"/>
app:key="misc.source"
app:icon="@drawable/ic_toggle_star"
app:title="@string/settings_misc_source"
app:summary="@string/settings_misc_source_summary"/>
<Preference
android:key="misc.logcat"
android:icon="@drawable/ic_action_bug_report"
android:title="@string/settings_misc_logcat"
android:summary="@string/settings_misc_logcat_summary"/>
app:key="misc.logcat"
app:icon="@drawable/ic_action_bug_report"
app:title="@string/settings_misc_logcat"
app:summary="@string/settings_misc_logcat_summary"/>
<Preference
android:key="misc.donate"
android:icon="@drawable/ic_action_card_giftcard"
android:title="@string/settings_misc_donate"
android:summary="@string/settings_misc_donate_summary"/>
app:key="misc.donate"
app:icon="@drawable/ic_action_card_giftcard"
app:title="@string/settings_misc_donate"
app:summary="@string/settings_misc_donate_summary"/>
</PreferenceCategory>
</PreferenceScreen>