Make InvocationHandler more robust
This commit is contained in:
@@ -251,13 +251,12 @@ object TetheringManager {
|
||||
val proxy = ProxyBuilder.forClass(classOnStartTetheringCallback).apply {
|
||||
dexCache(cacheDir)
|
||||
handler { proxy, method, args ->
|
||||
if (args.isNotEmpty()) Timber.w("Unexpected args for ${method.name}: $args")
|
||||
@Suppress("NAME_SHADOWING") val callback = reference.get()
|
||||
when (method.name) {
|
||||
"onTetheringStarted" -> callback?.onTetheringStarted()
|
||||
"onTetheringFailed" -> callback?.onTetheringFailed()
|
||||
else -> ProxyBuilder.callSuper(proxy, method, args)
|
||||
if (args.isEmpty()) when (method.name) {
|
||||
"onTetheringStarted" -> return@handler callback?.onTetheringStarted()
|
||||
"onTetheringFailed" -> return@handler callback?.onTetheringFailed()
|
||||
}
|
||||
ProxyBuilder.callSuper(proxy, method, args)
|
||||
}
|
||||
}.build()
|
||||
startTetheringLegacy(Services.connectivity, type, showProvisioningUi, proxy, handler)
|
||||
@@ -279,15 +278,9 @@ object TetheringManager {
|
||||
arrayOf(interfaceStartTetheringCallback), object : InvocationHandler {
|
||||
override fun invoke(proxy: Any, method: Method, args: Array<out Any?>?): Any? {
|
||||
@Suppress("NAME_SHADOWING") val callback = reference.get()
|
||||
return when (val name = method.name) {
|
||||
"onTetheringStarted" -> {
|
||||
if (!args.isNullOrEmpty()) Timber.w("Unexpected args for $name: $args")
|
||||
callback?.onTetheringStarted()
|
||||
}
|
||||
"onTetheringFailed" -> {
|
||||
if (args?.size != 1) Timber.w("Unexpected args for $name: $args")
|
||||
callback?.onTetheringFailed(args?.get(0) as Int)
|
||||
}
|
||||
return when {
|
||||
method.matches("onTetheringStarted") -> callback?.onTetheringStarted()
|
||||
method.matches1<Int>("onTetheringFailed") -> callback?.onTetheringFailed(args?.get(0) as Int)
|
||||
else -> callSuper(interfaceStartTetheringCallback, proxy, method, args)
|
||||
}
|
||||
}
|
||||
@@ -449,7 +442,7 @@ object TetheringManager {
|
||||
* *@param reg The new regular expressions.
|
||||
* @hide
|
||||
*/
|
||||
fun onTetherableInterfaceRegexpsChanged(args: Array<out Any?>?) {}
|
||||
fun onTetherableInterfaceRegexpsChanged(reg: Any?) {}
|
||||
|
||||
/**
|
||||
* Called when there was a change in the list of tetherable interfaces. Tetherable
|
||||
@@ -545,40 +538,34 @@ object TetheringManager {
|
||||
override fun invoke(proxy: Any, method: Method, args: Array<out Any?>?): Any? {
|
||||
@Suppress("NAME_SHADOWING")
|
||||
val callback = reference.get()
|
||||
val noArgs = args?.size ?: 0
|
||||
return when (val name = method.name) {
|
||||
"onTetheringSupported" -> {
|
||||
if (noArgs != 1) Timber.w("Unexpected args for $name: $args")
|
||||
return when {
|
||||
method.matches1<Boolean>("onTetheringSupported") -> {
|
||||
callback?.onTetheringSupported(args!![0] as Boolean)
|
||||
}
|
||||
"onUpstreamChanged" -> {
|
||||
if (noArgs != 1) Timber.w("Unexpected args for $name: $args")
|
||||
method.matches1<Network>("onUpstreamChanged") -> {
|
||||
callback?.onUpstreamChanged(args!![0] as Network?)
|
||||
}
|
||||
"onTetherableInterfaceRegexpsChanged" -> {
|
||||
if (regexpsSent) callback?.onTetherableInterfaceRegexpsChanged(args)
|
||||
method.name == "onTetherableInterfaceRegexpsChanged" &&
|
||||
method.parameters.singleOrNull()?.type?.name ==
|
||||
"android.net.TetheringManager\$TetheringInterfaceRegexps" -> {
|
||||
if (regexpsSent) callback?.onTetherableInterfaceRegexpsChanged(args!!.single())
|
||||
regexpsSent = true
|
||||
}
|
||||
"onTetherableInterfacesChanged" -> {
|
||||
if (noArgs != 1) Timber.w("Unexpected args for $name: $args")
|
||||
method.matches1<java.util.List<*>>("onTetherableInterfacesChanged") -> {
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
callback?.onTetherableInterfacesChanged(args!![0] as List<String?>)
|
||||
}
|
||||
"onTetheredInterfacesChanged" -> {
|
||||
if (noArgs != 1) Timber.w("Unexpected args for $name: $args")
|
||||
method.matches1<java.util.List<*>>("onTetheredInterfacesChanged") -> {
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
callback?.onTetheredInterfacesChanged(args!![0] as List<String?>)
|
||||
}
|
||||
"onError" -> {
|
||||
if (noArgs != 2) Timber.w("Unexpected args for $name: $args")
|
||||
method.matches2<String, Int>("onError") -> {
|
||||
callback?.onError(args!![0] as String, args[1] as Int)
|
||||
}
|
||||
"onClientsChanged" -> {
|
||||
if (noArgs != 1) Timber.w("Unexpected args for $name: $args")
|
||||
method.matches1<java.util.Collection<*>>("onClientsChanged") -> {
|
||||
callback?.onClientsChanged(args!![0] as Collection<*>)
|
||||
}
|
||||
"onOffloadStatusChanged" -> {
|
||||
if (noArgs != 1) Timber.w("Unexpected args for $name: $args")
|
||||
method.matches1<Int>("onOffloadStatusChanged") -> {
|
||||
callback?.onOffloadStatusChanged(args!![0] as Int)
|
||||
}
|
||||
else -> callSuper(interfaceTetheringEventCallback, proxy, method, args)
|
||||
|
||||
Reference in New Issue
Block a user