From 0ac5b25f85a0ec0b7179ffefa6feb7a934d796a3 Mon Sep 17 00:00:00 2001 From: Mygod Date: Mon, 12 Apr 2021 23:43:05 -0400 Subject: [PATCH] Migrate from using deprecated getLastTetherError --- README.md | 2 +- .../mygod/vpnhotspot/manage/TetherManager.kt | 6 +++-- .../vpnhotspot/manage/TetheringFragment.kt | 23 ++++++++++++++----- .../mygod/vpnhotspot/net/TetheringManager.kt | 1 + 4 files changed, 23 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index f02531c8..c78eed87 100644 --- a/README.md +++ b/README.md @@ -148,7 +148,7 @@ This is only meant to be an index. You can read more in the source code. Greylisted/blacklisted APIs or internal constants: (some constants are hardcoded or implicitly used) -* [`Landroid/net/ConnectivityManager;->getLastTetherError(Ljava/lang/String;)I,greylist`](https://android.googlesource.com/platform/prebuilts/runtime/+/4601d91/appcompat/hiddenapi-flags.csv#144306) +* (prior to API 30) [`Landroid/net/ConnectivityManager;->getLastTetherError(Ljava/lang/String;)I,greylist`](https://android.googlesource.com/platform/prebuilts/runtime/+/4601d91/appcompat/hiddenapi-flags.csv#144306) * (since API 30) `Landroid/net/ConnectivityModuleConnector;->IN_PROCESS_SUFFIX:Ljava/lang/String;` * (since API 30) [`Landroid/net/TetheringManager$TetheringEventCallback;->onTetherableInterfaceRegexpsChanged(Landroid/net/TetheringManager$TetheringInterfaceRegexps;)V,blacklist`](https://android.googlesource.com/platform/prebuilts/runtime/+/4601d91/appcompat/hiddenapi-flags.csv#148899) * (since API 30) `Landroid/net/TetheringManager;->TETHERING_WIGIG:I` diff --git a/mobile/src/main/java/be/mygod/vpnhotspot/manage/TetherManager.kt b/mobile/src/main/java/be/mygod/vpnhotspot/manage/TetherManager.kt index 36b86630..df3889e4 100644 --- a/mobile/src/main/java/be/mygod/vpnhotspot/manage/TetherManager.kt +++ b/mobile/src/main/java/be/mygod/vpnhotspot/manage/TetherManager.kt @@ -119,11 +119,13 @@ sealed class TetherManager(protected val parent: TetheringFragment) : Manager(), (viewHolder as ViewHolder).manager = this } - fun updateErrorMessage(errored: List) { + fun updateErrorMessage(errored: List, lastErrors: Map) { val interested = errored.filter { TetherType.ofInterface(it) == tetherType } baseError = if (interested.isEmpty()) null else interested.joinToString("\n") { iface -> "$iface: " + try { - TetheringManager.tetherErrorLookup(TetheringManager.getLastTetherError(iface)) + TetheringManager.tetherErrorLookup(if (Build.VERSION.SDK_INT < 30) @Suppress("DEPRECATION") { + TetheringManager.getLastTetherError(iface) + } else lastErrors[iface] ?: 0) } catch (e: InvocationTargetException) { if (Build.VERSION.SDK_INT !in 24..25 || e.cause !is SecurityException) Timber.w(e) else Timber.d(e) e.readableMessage diff --git a/mobile/src/main/java/be/mygod/vpnhotspot/manage/TetheringFragment.kt b/mobile/src/main/java/be/mygod/vpnhotspot/manage/TetheringFragment.kt index 7284ac35..e3f0b3fe 100644 --- a/mobile/src/main/java/be/mygod/vpnhotspot/manage/TetheringFragment.kt +++ b/mobile/src/main/java/be/mygod/vpnhotspot/manage/TetheringFragment.kt @@ -42,7 +42,8 @@ import java.net.NetworkInterface import java.net.SocketException class TetheringFragment : Fragment(), ServiceConnection, Toolbar.OnMenuItemClickListener { - inner class ManagerAdapter : ListAdapter(Manager) { + inner class ManagerAdapter : ListAdapter(Manager), + TetheringManager.TetheringEventCallback { internal val repeaterManager by lazy { RepeaterManager(this@TetheringFragment) } @get:RequiresApi(26) internal val localOnlyHotspotManager by lazy @TargetApi(26) { LocalOnlyHotspotManager(this@TetheringFragment) } @@ -69,6 +70,11 @@ class TetheringFragment : Fragment(), ServiceConnection, Toolbar.OnMenuItemClick this@TetheringFragment.enabledTypes = enabledIfaces.map { TetherType.ofInterface(it) }.toSet() } + val lastErrors = mutableMapOf() + override fun onError(ifName: String, error: Int) { + if (error == 0) lastErrors.remove(ifName) else lastErrors[ifName] = error + } + suspend fun notifyInterfaceChanged(lastList: List? = null) { @Suppress("NAME_SHADOWING") val lastList = lastList ?: listDeferred.await() val first = lastList.indexOfFirst { it is InterfaceManager } @@ -104,11 +110,11 @@ class TetheringFragment : Fragment(), ServiceConnection, Toolbar.OnMenuItemClick list.add(ManageBar) if (Build.VERSION.SDK_INT >= 24) { list.addAll(tetherManagers) - tetherManagers.forEach { it.updateErrorMessage(erroredIfaces) } + tetherManagers.forEach { it.updateErrorMessage(erroredIfaces, lastErrors) } } if (Build.VERSION.SDK_INT >= 30) { list.addAll(tetherManagers30) - tetherManagers30.forEach { it.updateErrorMessage(erroredIfaces) } + tetherManagers30.forEach { it.updateErrorMessage(erroredIfaces, lastErrors) } } if (Build.VERSION.SDK_INT < 26) { list.add(wifiManagerLegacy) @@ -279,15 +285,20 @@ class TetheringFragment : Fragment(), ServiceConnection, Toolbar.OnMenuItemClick lifecycleScope.launchWhenStarted { adapter.notifyInterfaceChanged() } } requireContext().registerReceiver(receiver, IntentFilter(TetheringManager.ACTION_TETHER_STATE_CHANGED)) - if (Build.VERSION.SDK_INT >= 30) TetherType.listener[this] = { - lifecycleScope.launchWhenStarted { adapter.notifyTetherTypeChanged() } + if (Build.VERSION.SDK_INT >= 30) { + TetheringManager.registerTetheringEventCallback(null, adapter) + TetherType.listener[this] = { lifecycleScope.launchWhenStarted { adapter.notifyTetherTypeChanged() } } } } override fun onServiceDisconnected(name: ComponentName?) { (binder ?: return).routingsChanged -= this binder = null - if (Build.VERSION.SDK_INT >= 30) TetherType.listener -= this + if (Build.VERSION.SDK_INT >= 30) { + TetherType.listener -= this + TetheringManager.unregisterTetheringEventCallback(adapter) + adapter.lastErrors.clear() + } requireContext().unregisterReceiver(receiver) } } 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 5d32771d..e60406b2 100644 --- a/mobile/src/main/java/be/mygod/vpnhotspot/net/TetheringManager.kt +++ b/mobile/src/main/java/be/mygod/vpnhotspot/net/TetheringManager.kt @@ -629,6 +629,7 @@ object TetheringManager { * @return error The error code of the last error tethering or untethering the named * interface */ + @Deprecated("Use {@link TetheringEventCallback#onError(String, int)} instead.") fun getLastTetherError(iface: String): Int = getLastTetherError(Services.connectivity, iface) as Int val tetherErrorLookup = ConstantLookup("TETHER_ERROR_",