From 382291a74e2b983f39aa3fe7a9a34e11b0c5b503 Mon Sep 17 00:00:00 2001 From: Mygod Date: Fri, 29 May 2020 05:36:20 +0800 Subject: [PATCH] Correctly handle tethering package in mainline module --- .../be/mygod/vpnhotspot/net/TetherType.kt | 38 ++++++++++++------- .../mygod/vpnhotspot/net/TetheringManager.kt | 15 +++++++- 2 files changed, 39 insertions(+), 14 deletions(-) diff --git a/mobile/src/main/java/be/mygod/vpnhotspot/net/TetherType.kt b/mobile/src/main/java/be/mygod/vpnhotspot/net/TetherType.kt index e55432a8..f494e379 100644 --- a/mobile/src/main/java/be/mygod/vpnhotspot/net/TetherType.kt +++ b/mobile/src/main/java/be/mygod/vpnhotspot/net/TetherType.kt @@ -2,6 +2,7 @@ package be.mygod.vpnhotspot.net import android.content.res.Resources import androidx.core.os.BuildCompat +import be.mygod.vpnhotspot.App.Companion.app import be.mygod.vpnhotspot.R import java.util.regex.Pattern @@ -33,24 +34,35 @@ enum class TetherType { private val ncmRegexs: List private val ethernetRegex: Pattern? + private fun Pair.getRegexs(name: String) = second + .getStringArray(second.getIdentifier(name, "array", first)) + .filterNotNull() + .map { it.toPattern() } + /** * Source: https://android.googlesource.com/platform/frameworks/base/+/32e772f/packages/Tethering/src/com/android/networkstack/tethering/TetheringConfiguration.java#93 */ init { - val system = Resources.getSystem() - fun getRegexs(name: String) = system - .getStringArray(system.getIdentifier(name, "array", "android")) - .filterNotNull() - .map { it.toPattern() } - usbRegexs = getRegexs("config_tether_usb_regexs") - wifiRegexs = getRegexs("config_tether_wifi_regexs") - wifiP2pRegexs = if (BuildCompat.isAtLeastR()) getRegexs("config_tether_wifi_p2p_regexs") else emptyList() - wimaxRegexs = getRegexs("config_tether_wimax_regexs") - bluetoothRegexs = getRegexs("config_tether_bluetooth_regexs") - ncmRegexs = if (BuildCompat.isAtLeastR()) getRegexs("config_tether_ncm_regexs") else emptyList() + val system = "android" to Resources.getSystem() + if (BuildCompat.isAtLeastR()) { + val tethering = TetheringManager.PACKAGE to app.packageManager.getResourcesForApplication( + TetheringManager.resolvedService.serviceInfo.applicationInfo) + usbRegexs = tethering.getRegexs("config_tether_usb_regexs") + wifiRegexs = tethering.getRegexs("config_tether_wifi_regexs") + wifiP2pRegexs = tethering.getRegexs("config_tether_wifi_p2p_regexs") + bluetoothRegexs = tethering.getRegexs("config_tether_bluetooth_regexs") + ncmRegexs = tethering.getRegexs("config_tether_ncm_regexs") + } else { + usbRegexs = system.getRegexs("config_tether_usb_regexs") + wifiRegexs = system.getRegexs("config_tether_wifi_regexs") + wifiP2pRegexs = emptyList() + bluetoothRegexs = system.getRegexs("config_tether_bluetooth_regexs") + ncmRegexs = emptyList() + } + wimaxRegexs = system.getRegexs("config_tether_wimax_regexs") // available since Android 4.0: https://android.googlesource.com/platform/frameworks/base/+/c96a667162fab44a250503caccb770109a9cb69a - ethernetRegex = system.getString(system.getIdentifier("config_ethernet_iface_regex", "string", - "android")).run { if (isEmpty()) null else toPattern() } + ethernetRegex = system.second.getString(system.second.getIdentifier( + "config_ethernet_iface_regex", "string", system.first)).run { if (isEmpty()) null else toPattern() } } /** diff --git a/mobile/src/main/java/be/mygod/vpnhotspot/net/TetheringManager.kt b/mobile/src/main/java/be/mygod/vpnhotspot/net/TetheringManager.kt index bba9723b..a9e90ad9 100644 --- a/mobile/src/main/java/be/mygod/vpnhotspot/net/TetheringManager.kt +++ b/mobile/src/main/java/be/mygod/vpnhotspot/net/TetheringManager.kt @@ -1,5 +1,6 @@ package be.mygod.vpnhotspot.net +import android.annotation.TargetApi import android.content.BroadcastReceiver import android.content.Context import android.content.Intent @@ -55,8 +56,15 @@ object TetheringManager { * @hide * @see android.net.TetheringManager */ + @RequiresApi(30) const val TETHERING_SERVICE = "tethering" + @RequiresApi(30) + const val PACKAGE = "com.android.networkstack.tethering" + + @RequiresApi(30) + private const val TETHERING_CONNECTOR_CLASS = "android.net.ITetheringConnector" + /** * This is a sticky broadcast since almost forever. * @@ -140,7 +148,12 @@ object TetheringManager { @get:RequiresApi(30) private val clazz by lazy { Class.forName("android.net.TetheringManager") } @get:RequiresApi(30) - private val instance by lazy { app.getSystemService(TETHERING_SERVICE) } + private val instance by lazy @TargetApi(30) { app.getSystemService(TETHERING_SERVICE) } + @get:RequiresApi(30) + val resolvedService by lazy @TargetApi(30) { + app.packageManager.queryIntentServices(Intent(TETHERING_CONNECTOR_CLASS), + PackageManager.MATCH_SYSTEM_ONLY).single() + } @get:RequiresApi(24) private val classOnStartTetheringCallback by lazy {