diff --git a/README.md b/README.md index 7aadba8f..2fde4596 100644 --- a/README.md +++ b/README.md @@ -98,6 +98,8 @@ Search the [issue tracker](https://github.com/Mygod/VPNHotspot/issues) for more. ### [What changes exactly can this app do to my system? (and how to revert them)](https://github.com/Mygod/VPNHotspot/issues/8#issuecomment-448529512) +### [Unable to find "Tethering hardware acceleration" in Developer options?](https://github.com/Mygod/VPNHotspot/issues/41#issuecomment-425732001) + ### [No root?](https://github.com/Mygod/VPNHotspot/issues/62) ### Failed to create group due to internal error/repeater shuts down after a while? diff --git a/build.gradle b/build.gradle index ac2db8c8..e3cfcaba 100644 --- a/build.gradle +++ b/build.gradle @@ -15,7 +15,7 @@ buildscript { classpath "com.android.tools.build:gradle:3.4.0-rc02" classpath 'com.github.ben-manes:gradle-versions-plugin:0.21.0' classpath 'com.google.gms:google-services:4.2.0' - classpath 'io.fabric.tools:gradle:1.28.0' + classpath 'io.fabric.tools:gradle:1.28.1' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion" } } diff --git a/mobile/build.gradle b/mobile/build.gradle index 355c8930..4629ec9c 100644 --- a/mobile/build.gradle +++ b/mobile/build.gradle @@ -67,7 +67,7 @@ def aux = [ 'com.google.firebase:firebase-core:16.0.8', ] def lifecycleVersion = '2.0.0' -def roomVersion = '2.1.0-alpha05' +def roomVersion = '2.1.0-alpha06' dependencies { kapt "androidx.lifecycle:lifecycle-compiler:$lifecycleVersion" kapt "androidx.room:room-compiler:$roomVersion" @@ -81,10 +81,10 @@ dependencies { implementation "androidx.room:room-ktx:$roomVersion" implementation 'com.android.billingclient:billing:1.2.2' implementation 'com.github.luongvo:BadgeView:1.1.5' - implementation 'com.github.topjohnwu.libsu:core:2.3.1' + implementation 'com.github.topjohnwu.libsu:core:2.3.3' implementation 'com.google.android.material:material:1.0.0' implementation 'com.jakewharton.timber:timber:4.7.1' - implementation 'com.linkedin.dexmaker:dexmaker:2.21.0' + implementation 'com.linkedin.dexmaker:dexmaker:2.25.0' implementation 'com.takisoft.preferencex:preferencex-simplemenu:1.0.0' implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlinVersion" implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.1.1' diff --git a/mobile/src/main/AndroidManifest.xml b/mobile/src/main/AndroidManifest.xml index 76d87ee1..3d9e95fe 100644 --- a/mobile/src/main/AndroidManifest.xml +++ b/mobile/src/main/AndroidManifest.xml @@ -93,7 +93,7 @@ android:name=".manage.LocalOnlyHotspotTileService" android:directBootAware="true" android:enabled="@bool/api_ge_26" - android:icon="@drawable/ic_device_wifi_tethering" + android:icon="@drawable/ic_action_perm_scan_wifi" android:label="@string/tethering_temp_hotspot" android:permission="android.permission.BIND_QUICK_SETTINGS_TILE"> diff --git a/mobile/src/main/java/be/mygod/vpnhotspot/client/ClientsFragment.kt b/mobile/src/main/java/be/mygod/vpnhotspot/client/ClientsFragment.kt index 30d5bc68..685439ef 100644 --- a/mobile/src/main/java/be/mygod/vpnhotspot/client/ClientsFragment.kt +++ b/mobile/src/main/java/be/mygod/vpnhotspot/client/ClientsFragment.kt @@ -67,11 +67,10 @@ class ClientsFragment : Fragment(), MainScope by MainScope.Supervisor() { override fun onClick(dialog: DialogInterface?, which: Int) { when (which) { DialogInterface.BUTTON_POSITIVE -> { + val newNickname = this.dialog!!.findViewById(android.R.id.edit).text MacLookup.abort(arg.mac) GlobalScope.launch(Dispatchers.Unconfined) { - AppDatabase.instance.clientRecordDao.upsert(arg.mac) { - nickname = this@NicknameDialogFragment.dialog!!.findViewById(android.R.id.edit).text - } + AppDatabase.instance.clientRecordDao.upsert(arg.mac) { nickname = newNickname } } } DialogInterface.BUTTON_NEUTRAL -> MacLookup.perform(arg.mac, true) diff --git a/mobile/src/main/java/be/mygod/vpnhotspot/manage/LocalOnlyHotspotManager.kt b/mobile/src/main/java/be/mygod/vpnhotspot/manage/LocalOnlyHotspotManager.kt index 309d3c48..19454a5e 100644 --- a/mobile/src/main/java/be/mygod/vpnhotspot/manage/LocalOnlyHotspotManager.kt +++ b/mobile/src/main/java/be/mygod/vpnhotspot/manage/LocalOnlyHotspotManager.kt @@ -79,10 +79,7 @@ class LocalOnlyHotspotManager(private val parent: TetheringFragment) : Manager() private inner class Data : be.mygod.vpnhotspot.manage.Data() { private val lookup: Map get() = parent.ifaceLookup - override val icon: Int get() { - val iface = binder?.iface - return (if (iface.isNullOrBlank()) TetherType.WIFI else TetherType.ofInterface(iface)).icon - } + override val icon get() = R.drawable.ic_action_perm_scan_wifi override val title: CharSequence get() { val configuration = binder?.configuration ?: return parent.getString(R.string.tethering_temp_hotspot) return SpannableStringBuilder("${configuration.SSID} - ").apply { diff --git a/mobile/src/main/java/be/mygod/vpnhotspot/manage/LocalOnlyHotspotTileService.kt b/mobile/src/main/java/be/mygod/vpnhotspot/manage/LocalOnlyHotspotTileService.kt index cabfe4bb..32c8fd79 100644 --- a/mobile/src/main/java/be/mygod/vpnhotspot/manage/LocalOnlyHotspotTileService.kt +++ b/mobile/src/main/java/be/mygod/vpnhotspot/manage/LocalOnlyHotspotTileService.kt @@ -15,7 +15,7 @@ import be.mygod.vpnhotspot.util.stopAndUnbind @RequiresApi(26) class LocalOnlyHotspotTileService : KillableTileService() { - private val tile by lazy { Icon.createWithResource(application, R.drawable.ic_device_wifi_tethering) } + private val tile by lazy { Icon.createWithResource(application, R.drawable.ic_action_perm_scan_wifi) } private var binder: LocalOnlyHotspotService.Binder? = null 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 e2b22373..13ca8d05 100644 --- a/mobile/src/main/java/be/mygod/vpnhotspot/manage/TetheringFragment.kt +++ b/mobile/src/main/java/be/mygod/vpnhotspot/manage/TetheringFragment.kt @@ -31,6 +31,7 @@ import be.mygod.vpnhotspot.net.TetheringManager.localOnlyTetheredIfaces import be.mygod.vpnhotspot.net.TetheringManager.tetheredIfaces import be.mygod.vpnhotspot.util.ServiceForegroundConnector import be.mygod.vpnhotspot.util.broadcastReceiver +import be.mygod.vpnhotspot.util.isNotGone import kotlinx.android.synthetic.main.activity_main.* import timber.log.Timber import java.net.NetworkInterface @@ -102,18 +103,11 @@ class TetheringFragment : Fragment(), ServiceConnection, MenuItem.OnMenuItemClic } private fun updateMonitorList(canMonitor: List = emptyList()) { - val toolbar = requireActivity().toolbar - val menu = toolbar.menu - if (canMonitor.isEmpty()) menu.removeItem(R.id.monitor) else { - var item = menu.findItem(R.id.monitor) - if (item == null) { - toolbar.inflateMenu(R.menu.toolbar_monitor) - item = menu.findItem(R.id.monitor)!! - } - item.subMenu.apply { - clear() - canMonitor.sorted().forEach { add(it).setOnMenuItemClickListener(this@TetheringFragment) } - } + val item = requireActivity().toolbar.menu.findItem(R.id.monitor) ?: return // assuming no longer foreground + item.isNotGone = canMonitor.isNotEmpty() + item.subMenu.apply { + clear() + canMonitor.sorted().forEach { add(it).setOnMenuItemClickListener(this@TetheringFragment) } } } override fun onMenuItemClick(item: MenuItem?): Boolean { @@ -130,9 +124,15 @@ class TetheringFragment : Fragment(), ServiceConnection, MenuItem.OnMenuItemClic binding.interfaces.adapter = adapter adapter.update(emptyList(), emptyList(), emptyList()) ServiceForegroundConnector(this, this, TetheringService::class) + requireActivity().toolbar.inflateMenu(R.menu.toolbar_tethering) return binding.root } + override fun onDestroyView() { + super.onDestroyView() + requireActivity().toolbar.menu.clear() + } + override fun onResume() { super.onResume() if (Build.VERSION.SDK_INT >= 27) ManageBar.Data.notifyChange() @@ -177,9 +177,4 @@ class TetheringFragment : Fragment(), ServiceConnection, MenuItem.OnMenuItemClic binder = null requireContext().unregisterReceiver(receiver) } - - override fun onDestroy() { - updateMonitorList() - super.onDestroy() - } } diff --git a/mobile/src/main/java/be/mygod/vpnhotspot/util/Utils.kt b/mobile/src/main/java/be/mygod/vpnhotspot/util/Utils.kt index 563b4adf..e0824b0b 100644 --- a/mobile/src/main/java/be/mygod/vpnhotspot/util/Utils.kt +++ b/mobile/src/main/java/be/mygod/vpnhotspot/util/Utils.kt @@ -6,6 +6,7 @@ import android.os.Build import android.text.Spannable import android.text.SpannableString import android.text.SpannableStringBuilder +import android.view.MenuItem import android.view.View import android.widget.ImageView import androidx.annotation.DrawableRes @@ -94,6 +95,13 @@ fun Context.stopAndUnbind(connection: ServiceConnection) { unbindService(connection) } +var MenuItem.isNotGone: Boolean + get() = isVisible || isEnabled + set(value) { + isVisible = value + isEnabled = value + } + fun MutableMap.computeIfAbsentCompat(key: K, value: () -> V) = if (Build.VERSION.SDK_INT >= 24) computeIfAbsent(key) { value() } else this[key] ?: value().also { put(key, it) } fun MutableMap.putIfAbsentCompat(key: K, value: V) = if (Build.VERSION.SDK_INT >= 24) diff --git a/mobile/src/main/res/drawable/ic_action_perm_scan_wifi.xml b/mobile/src/main/res/drawable/ic_action_perm_scan_wifi.xml new file mode 100644 index 00000000..a71c7496 --- /dev/null +++ b/mobile/src/main/res/drawable/ic_action_perm_scan_wifi.xml @@ -0,0 +1,9 @@ + + + diff --git a/mobile/src/main/res/menu/toolbar_monitor.xml b/mobile/src/main/res/menu/toolbar_tethering.xml similarity index 84% rename from mobile/src/main/res/menu/toolbar_monitor.xml rename to mobile/src/main/res/menu/toolbar_tethering.xml index 74c1b8d8..e1799d11 100644 --- a/mobile/src/main/res/menu/toolbar_monitor.xml +++ b/mobile/src/main/res/menu/toolbar_tethering.xml @@ -4,6 +4,8 @@