Merge branch 'master' into q-beta

This commit is contained in:
Mygod
2019-04-04 11:09:47 +08:00
11 changed files with 42 additions and 30 deletions

View File

@@ -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) ### [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) ### [No root?](https://github.com/Mygod/VPNHotspot/issues/62)
### Failed to create group due to internal error/repeater shuts down after a while? ### Failed to create group due to internal error/repeater shuts down after a while?

View File

@@ -15,7 +15,7 @@ buildscript {
classpath "com.android.tools.build:gradle:3.4.0-rc02" classpath "com.android.tools.build:gradle:3.4.0-rc02"
classpath 'com.github.ben-manes:gradle-versions-plugin:0.21.0' classpath 'com.github.ben-manes:gradle-versions-plugin:0.21.0'
classpath 'com.google.gms:google-services:4.2.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" classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion"
} }
} }

View File

@@ -67,7 +67,7 @@ def aux = [
'com.google.firebase:firebase-core:16.0.8', 'com.google.firebase:firebase-core:16.0.8',
] ]
def lifecycleVersion = '2.0.0' def lifecycleVersion = '2.0.0'
def roomVersion = '2.1.0-alpha05' def roomVersion = '2.1.0-alpha06'
dependencies { dependencies {
kapt "androidx.lifecycle:lifecycle-compiler:$lifecycleVersion" kapt "androidx.lifecycle:lifecycle-compiler:$lifecycleVersion"
kapt "androidx.room:room-compiler:$roomVersion" kapt "androidx.room:room-compiler:$roomVersion"
@@ -81,10 +81,10 @@ dependencies {
implementation "androidx.room:room-ktx:$roomVersion" implementation "androidx.room:room-ktx:$roomVersion"
implementation 'com.android.billingclient:billing:1.2.2' implementation 'com.android.billingclient:billing:1.2.2'
implementation 'com.github.luongvo:BadgeView:1.1.5' 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.google.android.material:material:1.0.0'
implementation 'com.jakewharton.timber:timber:4.7.1' 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 'com.takisoft.preferencex:preferencex-simplemenu:1.0.0'
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlinVersion" implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlinVersion"
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.1.1' implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.1.1'

View File

@@ -93,7 +93,7 @@
android:name=".manage.LocalOnlyHotspotTileService" android:name=".manage.LocalOnlyHotspotTileService"
android:directBootAware="true" android:directBootAware="true"
android:enabled="@bool/api_ge_26" 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:label="@string/tethering_temp_hotspot"
android:permission="android.permission.BIND_QUICK_SETTINGS_TILE"> android:permission="android.permission.BIND_QUICK_SETTINGS_TILE">
<intent-filter> <intent-filter>

View File

@@ -67,11 +67,10 @@ class ClientsFragment : Fragment(), MainScope by MainScope.Supervisor() {
override fun onClick(dialog: DialogInterface?, which: Int) { override fun onClick(dialog: DialogInterface?, which: Int) {
when (which) { when (which) {
DialogInterface.BUTTON_POSITIVE -> { DialogInterface.BUTTON_POSITIVE -> {
val newNickname = this.dialog!!.findViewById<EditText>(android.R.id.edit).text
MacLookup.abort(arg.mac) MacLookup.abort(arg.mac)
GlobalScope.launch(Dispatchers.Unconfined) { GlobalScope.launch(Dispatchers.Unconfined) {
AppDatabase.instance.clientRecordDao.upsert(arg.mac) { AppDatabase.instance.clientRecordDao.upsert(arg.mac) { nickname = newNickname }
nickname = this@NicknameDialogFragment.dialog!!.findViewById<EditText>(android.R.id.edit).text
}
} }
} }
DialogInterface.BUTTON_NEUTRAL -> MacLookup.perform(arg.mac, true) DialogInterface.BUTTON_NEUTRAL -> MacLookup.perform(arg.mac, true)

View File

@@ -79,10 +79,7 @@ class LocalOnlyHotspotManager(private val parent: TetheringFragment) : Manager()
private inner class Data : be.mygod.vpnhotspot.manage.Data() { private inner class Data : be.mygod.vpnhotspot.manage.Data() {
private val lookup: Map<String, NetworkInterface> get() = parent.ifaceLookup private val lookup: Map<String, NetworkInterface> get() = parent.ifaceLookup
override val icon: Int get() { override val icon get() = R.drawable.ic_action_perm_scan_wifi
val iface = binder?.iface
return (if (iface.isNullOrBlank()) TetherType.WIFI else TetherType.ofInterface(iface)).icon
}
override val title: CharSequence get() { override val title: CharSequence get() {
val configuration = binder?.configuration ?: return parent.getString(R.string.tethering_temp_hotspot) val configuration = binder?.configuration ?: return parent.getString(R.string.tethering_temp_hotspot)
return SpannableStringBuilder("${configuration.SSID} - ").apply { return SpannableStringBuilder("${configuration.SSID} - ").apply {

View File

@@ -15,7 +15,7 @@ import be.mygod.vpnhotspot.util.stopAndUnbind
@RequiresApi(26) @RequiresApi(26)
class LocalOnlyHotspotTileService : KillableTileService() { 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 private var binder: LocalOnlyHotspotService.Binder? = null

View File

@@ -31,6 +31,7 @@ import be.mygod.vpnhotspot.net.TetheringManager.localOnlyTetheredIfaces
import be.mygod.vpnhotspot.net.TetheringManager.tetheredIfaces import be.mygod.vpnhotspot.net.TetheringManager.tetheredIfaces
import be.mygod.vpnhotspot.util.ServiceForegroundConnector import be.mygod.vpnhotspot.util.ServiceForegroundConnector
import be.mygod.vpnhotspot.util.broadcastReceiver import be.mygod.vpnhotspot.util.broadcastReceiver
import be.mygod.vpnhotspot.util.isNotGone
import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.activity_main.*
import timber.log.Timber import timber.log.Timber
import java.net.NetworkInterface import java.net.NetworkInterface
@@ -102,20 +103,13 @@ class TetheringFragment : Fragment(), ServiceConnection, MenuItem.OnMenuItemClic
} }
private fun updateMonitorList(canMonitor: List<String> = emptyList()) { private fun updateMonitorList(canMonitor: List<String> = emptyList()) {
val toolbar = requireActivity().toolbar val item = requireActivity().toolbar.menu.findItem(R.id.monitor) ?: return // assuming no longer foreground
val menu = toolbar.menu item.isNotGone = canMonitor.isNotEmpty()
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 { item.subMenu.apply {
clear() clear()
canMonitor.sorted().forEach { add(it).setOnMenuItemClickListener(this@TetheringFragment) } canMonitor.sorted().forEach { add(it).setOnMenuItemClickListener(this@TetheringFragment) }
} }
} }
}
override fun onMenuItemClick(item: MenuItem?): Boolean { override fun onMenuItemClick(item: MenuItem?): Boolean {
ContextCompat.startForegroundService(requireContext(), Intent(context, TetheringService::class.java) ContextCompat.startForegroundService(requireContext(), Intent(context, TetheringService::class.java)
.putExtra(TetheringService.EXTRA_ADD_INTERFACE_MONITOR, item?.title ?: return false)) .putExtra(TetheringService.EXTRA_ADD_INTERFACE_MONITOR, item?.title ?: return false))
@@ -130,9 +124,15 @@ class TetheringFragment : Fragment(), ServiceConnection, MenuItem.OnMenuItemClic
binding.interfaces.adapter = adapter binding.interfaces.adapter = adapter
adapter.update(emptyList(), emptyList(), emptyList()) adapter.update(emptyList(), emptyList(), emptyList())
ServiceForegroundConnector(this, this, TetheringService::class) ServiceForegroundConnector(this, this, TetheringService::class)
requireActivity().toolbar.inflateMenu(R.menu.toolbar_tethering)
return binding.root return binding.root
} }
override fun onDestroyView() {
super.onDestroyView()
requireActivity().toolbar.menu.clear()
}
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
if (Build.VERSION.SDK_INT >= 27) ManageBar.Data.notifyChange() if (Build.VERSION.SDK_INT >= 27) ManageBar.Data.notifyChange()
@@ -177,9 +177,4 @@ class TetheringFragment : Fragment(), ServiceConnection, MenuItem.OnMenuItemClic
binder = null binder = null
requireContext().unregisterReceiver(receiver) requireContext().unregisterReceiver(receiver)
} }
override fun onDestroy() {
updateMonitorList()
super.onDestroy()
}
} }

View File

@@ -6,6 +6,7 @@ import android.os.Build
import android.text.Spannable import android.text.Spannable
import android.text.SpannableString import android.text.SpannableString
import android.text.SpannableStringBuilder import android.text.SpannableStringBuilder
import android.view.MenuItem
import android.view.View import android.view.View
import android.widget.ImageView import android.widget.ImageView
import androidx.annotation.DrawableRes import androidx.annotation.DrawableRes
@@ -94,6 +95,13 @@ fun Context.stopAndUnbind(connection: ServiceConnection) {
unbindService(connection) unbindService(connection)
} }
var MenuItem.isNotGone: Boolean
get() = isVisible || isEnabled
set(value) {
isVisible = value
isEnabled = value
}
fun <K, V> MutableMap<K, V>.computeIfAbsentCompat(key: K, value: () -> V) = if (Build.VERSION.SDK_INT >= 24) fun <K, V> MutableMap<K, V>.computeIfAbsentCompat(key: K, value: () -> V) = if (Build.VERSION.SDK_INT >= 24)
computeIfAbsent(key) { value() } else this[key] ?: value().also { put(key, it) } computeIfAbsent(key) { value() } else this[key] ?: value().also { put(key, it) }
fun <K, V> MutableMap<K, V>.putIfAbsentCompat(key: K, value: V) = if (Build.VERSION.SDK_INT >= 24) fun <K, V> MutableMap<K, V>.putIfAbsentCompat(key: K, value: V) = if (Build.VERSION.SDK_INT >= 24)

View File

@@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#FF000000"
android:pathData="M12,3C6.95,3 3.15,4.85 0,7.23L12,22 24,7.25C20.85,4.87 17.05,3 12,3zM13,16h-2v-6h2v6zM11,8L11,6h2v2h-2z"/>
</vector>

View File

@@ -4,6 +4,8 @@
<item android:id="@+id/monitor" <item android:id="@+id/monitor"
android:icon="@drawable/ic_image_remove_red_eye" android:icon="@drawable/ic_image_remove_red_eye"
android:title="@string/tethering_monitor" android:title="@string/tethering_monitor"
android:enabled="false"
android:visible="false"
app:showAsAction="always"> app:showAsAction="always">
<menu/> <menu/>
</item> </item>