Merge branch 'v2.4' into q-beta

This commit is contained in:
Mygod
2019-05-10 12:48:41 +08:00
5 changed files with 58 additions and 79 deletions

View File

@@ -19,8 +19,8 @@ android {
minSdkVersion 21
targetSdkVersion 28
resConfigs "ru", "zh-rCN"
versionCode 201
versionName "2.4.1"
versionCode 202
versionName "2.4.2"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
javaCompileOptions {
annotationProcessorOptions {

View File

@@ -9,7 +9,7 @@ import be.mygod.vpnhotspot.util.broadcastReceiver
@RequiresApi(24)
abstract class TetherListeningTileService : KillableTileService() {
protected var tethered: List<String> = emptyList()
protected var tethered: List<String>? = null
private val receiver = broadcastReceiver { _, intent ->
tethered = intent.tetheredIfaces ?: return@broadcastReceiver
@@ -18,9 +18,9 @@ abstract class TetherListeningTileService : KillableTileService() {
override fun onStartListening() {
super.onStartListening()
registerReceiver(receiver, IntentFilter(TetheringManager.ACTION_TETHER_STATE_CHANGED))?.tetheredIfaces?.let {
tethered = it
}
tethered = registerReceiver(receiver, IntentFilter(TetheringManager.ACTION_TETHER_STATE_CHANGED))
?.tetheredIfaces
updateTile()
}
override fun onStopListening() {

View File

@@ -29,7 +29,7 @@ sealed class TetheringTileService : TetherListeningTileService(), TetheringManag
protected abstract val labelString: Int
protected abstract val tetherType: TetherType
protected open val icon get() = tetherType.icon
protected val interested get() = tethered.filter { TetherType.ofInterface(it) == tetherType }
protected val interested get() = tethered?.filter { TetherType.ofInterface(it) == tetherType }
protected var binder: TetheringService.Binder? = null
protected abstract fun start()
@@ -52,19 +52,27 @@ sealed class TetheringTileService : TetherListeningTileService(), TetheringManag
}
override fun onServiceDisconnected(name: ComponentName?) {
binder?.routingsChanged?.remove(this)
binder = null
}
override fun updateTile() {
qsTile?.run {
val interested = interested
if (interested.isEmpty()) {
state = Tile.STATE_INACTIVE
icon = tileOff
} else {
val binder = binder ?: return
state = Tile.STATE_ACTIVE
icon = if (interested.all(binder::isActive)) tileOn else tileOff
when {
interested == null -> {
state = Tile.STATE_UNAVAILABLE
icon = tileOff
}
interested.isEmpty() -> {
state = Tile.STATE_INACTIVE
icon = tileOff
}
else -> {
val binder = binder ?: return
state = Tile.STATE_ACTIVE
icon = if (interested.all(binder::isActive)) tileOn else tileOff
}
}
label = getText(labelString)
updateTile()
@@ -88,7 +96,7 @@ sealed class TetheringTileService : TetherListeningTileService(), TetheringManag
}
}
override fun onClick() {
val interested = interested
val interested = interested ?: return
if (interested.isEmpty()) safeInvoker { start() } else {
val binder = binder
if (binder == null) tapPending = true else {
@@ -146,11 +154,14 @@ sealed class TetheringTileService : TetherListeningTileService(), TetheringManag
override fun updateTile() {
qsTile?.run {
when (tethering?.active) {
val interested = interested
if (interested == null) {
state = Tile.STATE_UNAVAILABLE
icon = tileOff
} else when (tethering?.active) {
true -> {
val binder = binder ?: return
state = Tile.STATE_ACTIVE
val interested = interested
icon = if (interested.isNotEmpty() && interested.all(binder::isActive)) tileOn else tileOff
}
false -> {
@@ -164,18 +175,20 @@ sealed class TetheringTileService : TetherListeningTileService(), TetheringManag
}
}
override fun onClick() = when (tethering?.active) {
true -> {
val binder = binder
if (binder == null) tapPending = true else {
val inactive = interested.filterNot(binder::isActive)
if (inactive.isEmpty()) safeInvoker { stop() }
else ContextCompat.startForegroundService(this, Intent(this, TetheringService::class.java)
.putExtra(TetheringService.EXTRA_ADD_INTERFACES, inactive.toTypedArray()))
override fun onClick() {
when (tethering?.active) {
true -> {
val binder = binder
if (binder == null) tapPending = true else {
val inactive = (interested ?: return).filterNot(binder::isActive)
if (inactive.isEmpty()) safeInvoker { stop() }
else ContextCompat.startForegroundService(this, Intent(this, TetheringService::class.java)
.putExtra(TetheringService.EXTRA_ADD_INTERFACES, inactive.toTypedArray()))
}
}
false -> safeInvoker { start() }
else -> tapPending = true
}
false -> safeInvoker { start() }
else -> tapPending = true
}
}

View File

@@ -1,54 +1,25 @@
package be.mygod.vpnhotspot.net
import android.content.res.Resources
import android.net.ConnectivityManager
import be.mygod.vpnhotspot.App.Companion.app
import be.mygod.vpnhotspot.R
import java.util.regex.Pattern
enum class TetherType {
NONE, WIFI_P2P, USB, WIFI, WIMAX, BLUETOOTH;
val icon get() = when (this) {
USB -> R.drawable.ic_device_usb
WIFI_P2P -> R.drawable.ic_action_settings_input_antenna
WIFI, WIMAX -> R.drawable.ic_device_network_wifi
BLUETOOTH -> R.drawable.ic_device_bluetooth
else -> R.drawable.ic_device_wifi_tethering
}
val isWifi get() = when (this) {
WIFI_P2P, WIFI, WIMAX -> true
else -> false
}
enum class TetherType(val icon: Int, val isWifi: Boolean = false) {
NONE(R.drawable.ic_device_wifi_tethering),
WIFI_P2P(R.drawable.ic_action_settings_input_antenna, true),
USB(R.drawable.ic_device_usb),
WIFI(R.drawable.ic_device_network_wifi, true),
BLUETOOTH(R.drawable.ic_device_bluetooth);
companion object {
private val usbRegexs: List<Pattern>
private val wifiRegexs: List<Pattern>
private val wimaxRegexs: List<Pattern>
private val bluetoothRegexs: List<Pattern>
/**
* Source: https://android.googlesource.com/platform/frameworks/base/+/61fa313/core/res/res/values/config.xml#328
*/
init {
val appRes = app.resources
val sysRes = Resources.getSystem()
usbRegexs = appRes.getStringArray(sysRes
.getIdentifier("config_tether_usb_regexs", "array", "android"))
.filterNotNull()
.map { it.toPattern() }
wifiRegexs = appRes.getStringArray(sysRes
.getIdentifier("config_tether_wifi_regexs", "array", "android"))
.filterNotNull()
.map { it.toPattern() }
wimaxRegexs = appRes.getStringArray(sysRes
.getIdentifier("config_tether_wimax_regexs", "array", "android"))
.filterNotNull()
.map { it.toPattern() }
bluetoothRegexs = appRes.getStringArray(sysRes
.getIdentifier("config_tether_bluetooth_regexs", "array", "android"))
.filterNotNull()
.map { it.toPattern() }
}
private fun getRegexs(type: String) =
(ConnectivityManager::class.java.getDeclaredMethod("getTetherable${type}Regexs")
.invoke(app.connectivity) as Array<String?>)
.filterNotNull()
.map { it.toPattern() }
private val usbRegexs = getRegexs("Usb")
private val wifiRegexs = getRegexs("Wifi")
private val bluetoothRegexs = getRegexs("Bluetooth")
/**
* Based on: https://android.googlesource.com/platform/frameworks/base/+/0e3d092/services/core/java/com/android/server/connectivity/Tethering.java#311
@@ -59,7 +30,6 @@ enum class TetherType {
wifiRegexs.any { it.matcher(iface).matches() } -> WIFI
usbRegexs.any { it.matcher(iface).matches() } -> USB
bluetoothRegexs.any { it.matcher(iface).matches() } -> BLUETOOTH
wimaxRegexs.any { it.matcher(iface).matches() } -> WIMAX
else -> NONE
}
}