Prevent main thread queries
This commit is contained in:
@@ -15,7 +15,7 @@ buildscript {
|
|||||||
classpath "com.android.tools.build:gradle:3.3.2"
|
classpath "com.android.tools.build:gradle:3.3.2"
|
||||||
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.27.1'
|
classpath 'io.fabric.tools:gradle:1.28.0'
|
||||||
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion"
|
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -65,10 +65,10 @@ androidExtensions {
|
|||||||
|
|
||||||
def aux = [
|
def aux = [
|
||||||
'com.crashlytics.sdk.android:crashlytics:2.9.9',
|
'com.crashlytics.sdk.android:crashlytics:2.9.9',
|
||||||
'com.google.firebase:firebase-core:16.0.7',
|
'com.google.firebase:firebase-core:16.0.8',
|
||||||
]
|
]
|
||||||
def lifecycleVersion = '2.0.0'
|
def lifecycleVersion = '2.0.0'
|
||||||
def roomVersion = '2.1.0-alpha04'
|
def roomVersion = '2.1.0-alpha05'
|
||||||
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"
|
||||||
@@ -79,7 +79,7 @@ dependencies {
|
|||||||
implementation "androidx.lifecycle:lifecycle-extensions:$lifecycleVersion"
|
implementation "androidx.lifecycle:lifecycle-extensions:$lifecycleVersion"
|
||||||
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycleVersion"
|
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycleVersion"
|
||||||
implementation 'androidx.preference:preference:1.1.0-alpha04'
|
implementation 'androidx.preference:preference:1.1.0-alpha04'
|
||||||
implementation "androidx.room:room-coroutines:$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.1'
|
||||||
|
|||||||
@@ -42,7 +42,6 @@ import be.mygod.vpnhotspot.util.computeIfAbsentCompat
|
|||||||
import be.mygod.vpnhotspot.util.toPluralInt
|
import be.mygod.vpnhotspot.util.toPluralInt
|
||||||
import be.mygod.vpnhotspot.widget.SmartSnackbar
|
import be.mygod.vpnhotspot.widget.SmartSnackbar
|
||||||
import kotlinx.android.parcel.Parcelize
|
import kotlinx.android.parcel.Parcelize
|
||||||
import kotlinx.coroutines.CoroutineStart
|
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.GlobalScope
|
import kotlinx.coroutines.GlobalScope
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
@@ -67,12 +66,14 @@ 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 -> GlobalScope.launch(Dispatchers.Main, CoroutineStart.UNDISPATCHED) {
|
DialogInterface.BUTTON_POSITIVE -> {
|
||||||
MacLookup.abort(arg.mac)
|
MacLookup.abort(arg.mac)
|
||||||
|
GlobalScope.launch(Dispatchers.Unconfined) {
|
||||||
AppDatabase.instance.clientRecordDao.upsert(arg.mac) {
|
AppDatabase.instance.clientRecordDao.upsert(arg.mac) {
|
||||||
nickname = this@NicknameDialogFragment.dialog!!.findViewById<EditText>(android.R.id.edit).text
|
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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -140,7 +141,7 @@ class ClientsFragment : Fragment(), MainScope by MainScope.Supervisor() {
|
|||||||
val wasWorking = TrafficRecorder.isWorking(client.mac)
|
val wasWorking = TrafficRecorder.isWorking(client.mac)
|
||||||
client.obtainRecord().apply {
|
client.obtainRecord().apply {
|
||||||
blocked = !blocked
|
blocked = !blocked
|
||||||
AppDatabase.instance.clientRecordDao.update(this)
|
launch(Dispatchers.Unconfined) { AppDatabase.instance.clientRecordDao.update(this@apply) }
|
||||||
}
|
}
|
||||||
IpNeighbourMonitor.instance?.flush()
|
IpNeighbourMonitor.instance?.flush()
|
||||||
if (!wasWorking && item.itemId == R.id.block) {
|
if (!wasWorking && item.itemId == R.id.block) {
|
||||||
@@ -150,7 +151,7 @@ class ClientsFragment : Fragment(), MainScope by MainScope.Supervisor() {
|
|||||||
}
|
}
|
||||||
R.id.stats -> {
|
R.id.stats -> {
|
||||||
binding.client?.let { client ->
|
binding.client?.let { client ->
|
||||||
launch(start = CoroutineStart.UNDISPATCHED) {
|
launch(Dispatchers.Unconfined) {
|
||||||
StatsDialogFragment().withArg(StatsArg(
|
StatsDialogFragment().withArg(StatsArg(
|
||||||
client.title.value ?: return@launch,
|
client.title.value ?: return@launch,
|
||||||
AppDatabase.instance.trafficRecordDao.queryStats(client.mac)
|
AppDatabase.instance.trafficRecordDao.queryStats(client.mac)
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ import be.mygod.vpnhotspot.util.RootSession
|
|||||||
import be.mygod.vpnhotspot.util.parseNumericAddress
|
import be.mygod.vpnhotspot.util.parseNumericAddress
|
||||||
import be.mygod.vpnhotspot.util.putIfAbsentCompat
|
import be.mygod.vpnhotspot.util.putIfAbsentCompat
|
||||||
import be.mygod.vpnhotspot.widget.SmartSnackbar
|
import be.mygod.vpnhotspot.widget.SmartSnackbar
|
||||||
|
import kotlinx.coroutines.runBlocking
|
||||||
import timber.log.Timber
|
import timber.log.Timber
|
||||||
import java.net.InetAddress
|
import java.net.InetAddress
|
||||||
import java.util.concurrent.TimeUnit
|
import java.util.concurrent.TimeUnit
|
||||||
@@ -26,7 +27,7 @@ object TrafficRecorder {
|
|||||||
|
|
||||||
fun register(ip: InetAddress, downstream: String, mac: Long) {
|
fun register(ip: InetAddress, downstream: String, mac: Long) {
|
||||||
val record = TrafficRecord(mac = mac, ip = ip, downstream = downstream)
|
val record = TrafficRecord(mac = mac, ip = ip, downstream = downstream)
|
||||||
AppDatabase.instance.trafficRecordDao.insert(record)
|
runBlocking { AppDatabase.instance.trafficRecordDao.insert(record) }
|
||||||
synchronized(this) {
|
synchronized(this) {
|
||||||
DebugHelper.log(TAG, "Registering $ip%$downstream")
|
DebugHelper.log(TAG, "Registering $ip%$downstream")
|
||||||
check(records.putIfAbsentCompat(Pair(ip, downstream), record) == null)
|
check(records.putIfAbsentCompat(Pair(ip, downstream), record) == null)
|
||||||
@@ -119,7 +120,7 @@ object TrafficRecorder {
|
|||||||
check(record.sentBytes >= 0)
|
check(record.sentBytes >= 0)
|
||||||
check(record.receivedPackets >= 0)
|
check(record.receivedPackets >= 0)
|
||||||
check(record.receivedBytes >= 0)
|
check(record.receivedBytes >= 0)
|
||||||
AppDatabase.instance.trafficRecordDao.insert(record)
|
runBlocking { AppDatabase.instance.trafficRecordDao.insert(record) }
|
||||||
}
|
}
|
||||||
foregroundListeners(records.values, oldRecords)
|
foregroundListeners(records.values, oldRecords)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,7 +19,6 @@ abstract class AppDatabase : RoomDatabase() {
|
|||||||
.addMigrations(
|
.addMigrations(
|
||||||
Migration2
|
Migration2
|
||||||
)
|
)
|
||||||
.allowMainThreadQueries()
|
|
||||||
.build()
|
.build()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,11 +21,11 @@ data class ClientRecord(@PrimaryKey
|
|||||||
abstract fun lookupSync(mac: Long): LiveData<ClientRecord>
|
abstract fun lookupSync(mac: Long): LiveData<ClientRecord>
|
||||||
|
|
||||||
@Insert(onConflict = OnConflictStrategy.REPLACE)
|
@Insert(onConflict = OnConflictStrategy.REPLACE)
|
||||||
protected abstract fun updateInternal(value: ClientRecord): Long
|
protected abstract suspend fun updateInternal(value: ClientRecord): Long
|
||||||
fun update(value: ClientRecord) = check(updateInternal(value) == value.mac)
|
suspend fun update(value: ClientRecord) = check(updateInternal(value) == value.mac)
|
||||||
|
|
||||||
@Transaction
|
@Transaction
|
||||||
open fun upsert(mac: Long, operation: ClientRecord.() -> Unit) = runBlocking { lookupOrDefault(mac) }.apply {
|
open suspend fun upsert(mac: Long, operation: suspend ClientRecord.() -> Unit) = lookupOrDefault(mac).apply {
|
||||||
operation()
|
operation()
|
||||||
update(this)
|
update(this)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -41,8 +41,8 @@ data class TrafficRecord(
|
|||||||
@androidx.room.Dao
|
@androidx.room.Dao
|
||||||
abstract class Dao {
|
abstract class Dao {
|
||||||
@Insert
|
@Insert
|
||||||
protected abstract fun insertInternal(value: TrafficRecord): Long
|
protected abstract suspend fun insertInternal(value: TrafficRecord): Long
|
||||||
fun insert(value: TrafficRecord) {
|
suspend fun insert(value: TrafficRecord) {
|
||||||
check(value.id == null)
|
check(value.id == null)
|
||||||
value.id = insertInternal(value)
|
value.id = insertInternal(value)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user