Be more careful about using unsupported APIs
This commit is contained in:
@@ -200,6 +200,10 @@ object WifiApManager {
|
|||||||
private val cancelLocalOnlyHotspotRequest by lazy {
|
private val cancelLocalOnlyHotspotRequest by lazy {
|
||||||
WifiManager::class.java.getDeclaredMethod("cancelLocalOnlyHotspotRequest")
|
WifiManager::class.java.getDeclaredMethod("cancelLocalOnlyHotspotRequest")
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* This is the only way to unregister requests besides app exiting.
|
||||||
|
* Therefore, we are happy with crashing the app if reflection fails.
|
||||||
|
*/
|
||||||
@RequiresApi(26)
|
@RequiresApi(26)
|
||||||
fun cancelLocalOnlyHotspotRequest() = cancelLocalOnlyHotspotRequest(Services.wifi)
|
fun cancelLocalOnlyHotspotRequest() = cancelLocalOnlyHotspotRequest(Services.wifi)
|
||||||
|
|
||||||
|
|||||||
@@ -159,10 +159,14 @@ private val newLookup by lazy @TargetApi(26) {
|
|||||||
* See also: https://stackoverflow.com/a/49532463/2245107
|
* See also: https://stackoverflow.com/a/49532463/2245107
|
||||||
*/
|
*/
|
||||||
fun InvocationHandler.callSuper(interfaceClass: Class<*>, proxy: Any, method: Method, args: Array<out Any?>?) = when {
|
fun InvocationHandler.callSuper(interfaceClass: Class<*>, proxy: Any, method: Method, args: Array<out Any?>?) = when {
|
||||||
Build.VERSION.SDK_INT >= 26 && method.isDefault -> newLookup.newInstance(interfaceClass, 0xf) // ALL_MODES
|
Build.VERSION.SDK_INT >= 26 && method.isDefault -> try {
|
||||||
.`in`(interfaceClass).unreflectSpecial(method, interfaceClass).bindTo(proxy).run {
|
newLookup.newInstance(interfaceClass, 0xf) // ALL_MODES
|
||||||
if (args == null) invokeWithArguments() else invokeWithArguments(*args)
|
} catch (e: ReflectiveOperationException) {
|
||||||
}
|
Timber.w(e)
|
||||||
|
MethodHandles.lookup().`in`(interfaceClass)
|
||||||
|
}.unreflectSpecial(method, interfaceClass).bindTo(proxy).run {
|
||||||
|
if (args == null) invokeWithArguments() else invokeWithArguments(*args)
|
||||||
|
}
|
||||||
// otherwise, we just redispatch it to InvocationHandler
|
// otherwise, we just redispatch it to InvocationHandler
|
||||||
method.declaringClass.isAssignableFrom(javaClass) -> when {
|
method.declaringClass.isAssignableFrom(javaClass) -> when {
|
||||||
method.declaringClass == Object::class.java -> when (method.name) {
|
method.declaringClass == Object::class.java -> when (method.name) {
|
||||||
|
|||||||
Reference in New Issue
Block a user