Refine TetheringEventCallback

This commit is contained in:
Mygod
2020-07-09 07:34:16 +08:00
parent 845574144d
commit 8674369b5b

View File

@@ -509,12 +509,15 @@ object TetheringManager {
fun registerTetheringEventCallback(executor: Executor?, callback: TetheringEventCallback) { fun registerTetheringEventCallback(executor: Executor?, callback: TetheringEventCallback) {
val reference = WeakReference(callback) val reference = WeakReference(callback)
val proxy = synchronized(callbackMap) { val proxy = synchronized(callbackMap) {
var computed = false
callbackMap.computeIfAbsent(callback) { callbackMap.computeIfAbsent(callback) {
computed = true
Proxy.newProxyInstance(interfaceTetheringEventCallback.classLoader, Proxy.newProxyInstance(interfaceTetheringEventCallback.classLoader,
arrayOf(interfaceTetheringEventCallback), object : InvocationHandler { arrayOf(interfaceTetheringEventCallback), object : InvocationHandler {
private var regexpsSent = false private var regexpsSent = false
override fun invoke(proxy: Any, method: Method, args: Array<out Any?>?): Any? { override fun invoke(proxy: Any, method: Method, args: Array<out Any?>?): Any? {
@Suppress("NAME_SHADOWING") val callback = reference.get() @Suppress("NAME_SHADOWING")
val callback = reference.get()
val noArgs = args?.size ?: 0 val noArgs = args?.size ?: 0
return when (val name = method.name) { return when (val name = method.name) {
"onTetheringSupported" -> { "onTetheringSupported" -> {
@@ -555,7 +558,7 @@ object TetheringManager {
} }
} }
}) })
} }.also { if (!computed) return }
} }
registerTetheringEventCallback(instance, executor ?: null.makeExecutor(), proxy) registerTetheringEventCallback(instance, executor ?: null.makeExecutor(), proxy)
} }
@@ -579,23 +582,19 @@ object TetheringManager {
* Only [TetheringEventCallback.onTetheredInterfacesChanged] is supported on API 29-. * Only [TetheringEventCallback.onTetheredInterfacesChanged] is supported on API 29-.
*/ */
fun registerTetheringEventCallbackCompat(context: Context, callback: TetheringEventCallback) { fun registerTetheringEventCallbackCompat(context: Context, callback: TetheringEventCallback) {
if (Build.VERSION.SDK_INT >= 30) { if (Build.VERSION.SDK_INT < 30) synchronized(callbackMap) {
registerTetheringEventCallback(null.makeExecutor(), callback)
} else synchronized(callbackMap) {
callbackMap.computeIfAbsent(callback) { callbackMap.computeIfAbsent(callback) {
broadcastReceiver { _, intent -> broadcastReceiver { _, intent ->
callback.onTetheredInterfacesChanged(intent.tetheredIfaces ?: return@broadcastReceiver) callback.onTetheredInterfacesChanged(intent.tetheredIfaces ?: return@broadcastReceiver)
}.also { context.registerReceiver(it, IntentFilter(ACTION_TETHER_STATE_CHANGED)) } }.also { context.registerReceiver(it, IntentFilter(ACTION_TETHER_STATE_CHANGED)) }
} }
} } else registerTetheringEventCallback(null.makeExecutor(), callback)
} }
fun unregisterTetheringEventCallbackCompat(context: Context, callback: TetheringEventCallback) { fun unregisterTetheringEventCallbackCompat(context: Context, callback: TetheringEventCallback) {
if (Build.VERSION.SDK_INT >= 30) { if (Build.VERSION.SDK_INT < 30) {
unregisterTetheringEventCallback(callback)
} else {
val receiver = synchronized(callbackMap) { callbackMap.remove(callback) } ?: return val receiver = synchronized(callbackMap) { callbackMap.remove(callback) } ?: return
context.ensureReceiverUnregistered(receiver as BroadcastReceiver) context.ensureReceiverUnregistered(receiver as BroadcastReceiver)
} } else unregisterTetheringEventCallback(callback)
} }
/** /**