diff --git a/build.gradle b/build.gradle index 06c62432..c570af81 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ buildscript { ext { kotlinVersion = '1.3.20' lifecycleVersion = '2.0.0' - roomVersion = '2.1.0-alpha03' + roomVersion = '2.1.0-alpha04' } repositories { google() diff --git a/mobile/src/main/java/be/mygod/vpnhotspot/App.kt b/mobile/src/main/java/be/mygod/vpnhotspot/App.kt index 8507be73..183e4fbe 100644 --- a/mobile/src/main/java/be/mygod/vpnhotspot/App.kt +++ b/mobile/src/main/java/be/mygod/vpnhotspot/App.kt @@ -46,6 +46,7 @@ class App : Application() { R.array.com_google_android_gms_fonts_certs)).apply { setEmojiSpanIndicatorEnabled(BuildConfig.DEBUG) registerInitCallback(object : EmojiCompat.InitCallback() { + override fun onInitialized() = DebugHelper.log("EmojiCompat", "Initialized") override fun onFailed(throwable: Throwable?) = Timber.d(throwable) }) }) 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 11e1bc99..8a97c66f 100644 --- a/mobile/src/main/java/be/mygod/vpnhotspot/client/ClientsFragment.kt +++ b/mobile/src/main/java/be/mygod/vpnhotspot/client/ClientsFragment.kt @@ -137,7 +137,9 @@ class ClientsFragment : Fragment(), MainScope by MainScope.Supervisor() { val wasWorking = TrafficRecorder.isWorking(client.mac) client.obtainRecord().apply { blocked = !blocked - AppDatabase.instance.clientRecordDao.update(this) + GlobalScope.launch(Dispatchers.Main, CoroutineStart.UNDISPATCHED) { + AppDatabase.instance.clientRecordDao.update(this@apply) + } } IpNeighbourMonitor.instance?.flush() if (!wasWorking && item.itemId == R.id.block) { diff --git a/mobile/src/main/java/be/mygod/vpnhotspot/net/monitor/TrafficRecorder.kt b/mobile/src/main/java/be/mygod/vpnhotspot/net/monitor/TrafficRecorder.kt index 3d61b028..0c856f5b 100644 --- a/mobile/src/main/java/be/mygod/vpnhotspot/net/monitor/TrafficRecorder.kt +++ b/mobile/src/main/java/be/mygod/vpnhotspot/net/monitor/TrafficRecorder.kt @@ -10,6 +10,10 @@ import be.mygod.vpnhotspot.util.Event2 import be.mygod.vpnhotspot.util.RootSession import be.mygod.vpnhotspot.util.parseNumericAddress import be.mygod.vpnhotspot.widget.SmartSnackbar +import kotlinx.coroutines.CoroutineStart +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.launch import timber.log.Timber import java.net.InetAddress import java.util.concurrent.TimeUnit @@ -25,7 +29,9 @@ object TrafficRecorder { fun register(ip: InetAddress, downstream: String, mac: Long) { val record = TrafficRecord(mac = mac, ip = ip, downstream = downstream) - AppDatabase.instance.trafficRecordDao.insert(record) + GlobalScope.launch(Dispatchers.Main, CoroutineStart.UNDISPATCHED) { + AppDatabase.instance.trafficRecordDao.insert(record) + } synchronized(this) { DebugHelper.log(TAG, "Registering $ip%$downstream") check(records.put(Pair(ip, downstream), record) == null) @@ -117,7 +123,9 @@ object TrafficRecorder { check(record.sentBytes >= 0) check(record.receivedPackets >= 0) check(record.receivedBytes >= 0) - AppDatabase.instance.trafficRecordDao.insert(record) + GlobalScope.launch(Dispatchers.Main, CoroutineStart.UNDISPATCHED) { + AppDatabase.instance.trafficRecordDao.insert(record) + } } foregroundListeners(records.values, oldRecords) } diff --git a/mobile/src/main/java/be/mygod/vpnhotspot/room/AppDatabase.kt b/mobile/src/main/java/be/mygod/vpnhotspot/room/AppDatabase.kt index d97dda58..f8ab1baf 100644 --- a/mobile/src/main/java/be/mygod/vpnhotspot/room/AppDatabase.kt +++ b/mobile/src/main/java/be/mygod/vpnhotspot/room/AppDatabase.kt @@ -19,7 +19,6 @@ abstract class AppDatabase : RoomDatabase() { .addMigrations( Migration2 ) - .allowMainThreadQueries() .build() } } diff --git a/mobile/src/main/java/be/mygod/vpnhotspot/room/ClientRecord.kt b/mobile/src/main/java/be/mygod/vpnhotspot/room/ClientRecord.kt index ea6f303e..7152ea27 100644 --- a/mobile/src/main/java/be/mygod/vpnhotspot/room/ClientRecord.kt +++ b/mobile/src/main/java/be/mygod/vpnhotspot/room/ClientRecord.kt @@ -2,6 +2,10 @@ package be.mygod.vpnhotspot.room import androidx.lifecycle.LiveData import androidx.room.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.async +import kotlinx.coroutines.runBlocking @Entity data class ClientRecord(@PrimaryKey @@ -20,13 +24,17 @@ data class ClientRecord(@PrimaryKey abstract fun lookupSync(mac: Long): LiveData @Insert(onConflict = OnConflictStrategy.REPLACE) - protected abstract fun updateInternal(value: ClientRecord): Long - fun update(value: ClientRecord) = check(updateInternal(value) == value.mac) + protected abstract suspend fun updateInternal(value: ClientRecord): Long + suspend fun update(value: ClientRecord) = check(updateInternal(value) == value.mac) @Transaction - open suspend fun upsert(mac: Long, operation: ClientRecord.() -> Unit) = lookupOrDefault(mac).apply { - operation() - update(this) + protected open fun upsertSync(mac: Long, operation: ClientRecord.() -> Unit) = runBlocking { + lookupOrDefault(mac).apply { + operation() + update(this) + } } + fun upsert(mac: Long, operation: ClientRecord.() -> Unit) = + GlobalScope.async(Dispatchers.IO) { upsertSync(mac, operation) } } } diff --git a/mobile/src/main/java/be/mygod/vpnhotspot/room/TrafficRecord.kt b/mobile/src/main/java/be/mygod/vpnhotspot/room/TrafficRecord.kt index 163efd0b..76c2a558 100644 --- a/mobile/src/main/java/be/mygod/vpnhotspot/room/TrafficRecord.kt +++ b/mobile/src/main/java/be/mygod/vpnhotspot/room/TrafficRecord.kt @@ -40,8 +40,8 @@ data class TrafficRecord( @androidx.room.Dao abstract class Dao { @Insert - protected abstract fun insertInternal(value: TrafficRecord): Long - fun insert(value: TrafficRecord) { + protected abstract suspend fun insertInternal(value: TrafficRecord): Long + suspend fun insert(value: TrafficRecord) { check(value.id == null) value.id = insertInternal(value) }