diff --git a/android/app/src/main/kotlin/com/hiddify/hiddify/EventHandler.kt b/android/app/src/main/kotlin/com/hiddify/hiddify/EventHandler.kt index 26f6cacc..cf5717ad 100644 --- a/android/app/src/main/kotlin/com/hiddify/hiddify/EventHandler.kt +++ b/android/app/src/main/kotlin/com/hiddify/hiddify/EventHandler.kt @@ -15,17 +15,17 @@ class EventHandler : FlutterPlugin { const val SERVICE_ALERTS = "com.hiddify.app/service.alerts" } - private lateinit var statusChannel: EventChannel - private lateinit var alertsChannel: EventChannel + private var statusChannel: EventChannel? = null + private var alertsChannel: EventChannel? = null - private lateinit var statusObserver: Observer - private lateinit var alertsObserver: Observer + private var statusObserver: Observer? = null + private var alertsObserver: Observer? = null override fun onAttachedToEngine(flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) { statusChannel = EventChannel(flutterPluginBinding.binaryMessenger, SERVICE_STATUS) alertsChannel = EventChannel(flutterPluginBinding.binaryMessenger, SERVICE_ALERTS) - statusChannel.setStreamHandler(object : EventChannel.StreamHandler { + statusChannel!!.setStreamHandler(object : EventChannel.StreamHandler { override fun onListen(arguments: Any?, events: EventChannel.EventSink?) { statusObserver = Observer { Log.d(TAG, "new status: $it") @@ -35,15 +35,16 @@ class EventHandler : FlutterPlugin { .toMap() events?.success(map) } - MainActivity.instance.serviceStatus.observeForever(statusObserver) + MainActivity.instance.serviceStatus.observeForever(statusObserver!!) } override fun onCancel(arguments: Any?) { - MainActivity.instance.serviceStatus.removeObserver(statusObserver) + if (statusObserver != null) + MainActivity.instance.serviceStatus.removeObserver(statusObserver!!) } }) - alertsChannel.setStreamHandler(object : EventChannel.StreamHandler { + alertsChannel!!.setStreamHandler(object : EventChannel.StreamHandler { override fun onListen(arguments: Any?, events: EventChannel.EventSink?) { alertsObserver = Observer { if (it == null) return@Observer @@ -57,20 +58,23 @@ class EventHandler : FlutterPlugin { .toMap() events?.success(map) } - MainActivity.instance.serviceAlerts.observeForever(alertsObserver) + MainActivity.instance.serviceAlerts.observeForever(alertsObserver!!) } override fun onCancel(arguments: Any?) { - MainActivity.instance.serviceAlerts.removeObserver(alertsObserver) + if (alertsObserver != null) + MainActivity.instance.serviceAlerts.removeObserver(alertsObserver!!) } }) } override fun onDetachedFromEngine(binding: FlutterPlugin.FlutterPluginBinding) { - MainActivity.instance.serviceStatus.removeObserver(statusObserver) - statusChannel.setStreamHandler(null) - MainActivity.instance.serviceAlerts.removeObserver(alertsObserver) - alertsChannel.setStreamHandler(null) + if (statusObserver != null) + MainActivity.instance.serviceStatus.removeObserver(statusObserver!!) + statusChannel?.setStreamHandler(null) + if (alertsObserver != null) + MainActivity.instance.serviceAlerts.removeObserver(alertsObserver!!) + alertsChannel?.setStreamHandler(null) } } diff --git a/android/app/src/main/kotlin/com/hiddify/hiddify/GroupsChannel.kt b/android/app/src/main/kotlin/com/hiddify/hiddify/GroupsChannel.kt index 164607ff..bf492953 100644 --- a/android/app/src/main/kotlin/com/hiddify/hiddify/GroupsChannel.kt +++ b/android/app/src/main/kotlin/com/hiddify/hiddify/GroupsChannel.kt @@ -20,7 +20,7 @@ class GroupsChannel(private val scope: CoroutineScope) : FlutterPlugin, CommandC private val commandClient = CommandClient(scope, CommandClient.ConnectionType.Groups, this) - private lateinit var groupsChannel: EventChannel + private var groupsChannel: EventChannel? = null private var groupsEvent: EventChannel.EventSink? = null @@ -37,7 +37,7 @@ class GroupsChannel(private val scope: CoroutineScope) : FlutterPlugin, CommandC GROUP_CHANNEL ) - groupsChannel.setStreamHandler(object : EventChannel.StreamHandler { + groupsChannel!!.setStreamHandler(object : EventChannel.StreamHandler { override fun onListen(arguments: Any?, events: EventChannel.EventSink?) { groupsEvent = events Log.d(TAG, "connecting groups command client") @@ -55,6 +55,7 @@ class GroupsChannel(private val scope: CoroutineScope) : FlutterPlugin, CommandC override fun onDetachedFromEngine(binding: FlutterPlugin.FlutterPluginBinding) { groupsEvent = null commandClient.disconnect() + groupsChannel?.setStreamHandler(null) } data class KOutboundGroup( diff --git a/android/app/src/main/kotlin/com/hiddify/hiddify/MethodHandler.kt b/android/app/src/main/kotlin/com/hiddify/hiddify/MethodHandler.kt index 1bb5e8fe..6a3b8cbe 100644 --- a/android/app/src/main/kotlin/com/hiddify/hiddify/MethodHandler.kt +++ b/android/app/src/main/kotlin/com/hiddify/hiddify/MethodHandler.kt @@ -13,7 +13,7 @@ import kotlinx.coroutines.delay import kotlinx.coroutines.launch class MethodHandler : FlutterPlugin, MethodChannel.MethodCallHandler { - private lateinit var channel: MethodChannel + private var channel: MethodChannel? = null companion object { const val channelName = "com.hiddify.app/method" @@ -37,11 +37,11 @@ class MethodHandler : FlutterPlugin, MethodChannel.MethodCallHandler { StandardMethodCodec.INSTANCE, taskQueue ) - channel.setMethodCallHandler(this) + channel!!.setMethodCallHandler(this) } override fun onDetachedFromEngine(binding: FlutterPlugin.FlutterPluginBinding) { - channel.setMethodCallHandler(null) + channel?.setMethodCallHandler(null) } override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) { diff --git a/android/app/src/main/kotlin/com/hiddify/hiddify/PlatformSettingsHandler.kt b/android/app/src/main/kotlin/com/hiddify/hiddify/PlatformSettingsHandler.kt index e3e2f7ff..d22765da 100644 --- a/android/app/src/main/kotlin/com/hiddify/hiddify/PlatformSettingsHandler.kt +++ b/android/app/src/main/kotlin/com/hiddify/hiddify/PlatformSettingsHandler.kt @@ -30,7 +30,7 @@ import java.io.ByteArrayOutputStream class PlatformSettingsHandler : FlutterPlugin, MethodChannel.MethodCallHandler, ActivityAware, PluginRegistry.ActivityResultListener { - private lateinit var channel: MethodChannel + private var channel: MethodChannel? = null private var activity: Activity? = null private lateinit var ignoreRequestResult: MethodChannel.Result @@ -56,11 +56,11 @@ class PlatformSettingsHandler : FlutterPlugin, MethodChannel.MethodCallHandler, StandardMethodCodec.INSTANCE, taskQueue ) - channel.setMethodCallHandler(this) + channel!!.setMethodCallHandler(this) } override fun onDetachedFromEngine(binding: FlutterPlugin.FlutterPluginBinding) { - channel.setMethodCallHandler(null) + channel?.setMethodCallHandler(null) } override fun onAttachedToActivity(binding: ActivityPluginBinding) { diff --git a/lib/data/local/dao/profiles_dao.dart b/lib/data/local/dao/profiles_dao.dart index b1c0f23d..3d41c934 100644 --- a/lib/data/local/dao/profiles_dao.dart +++ b/lib/data/local/dao/profiles_dao.dart @@ -32,7 +32,9 @@ class ProfilesDao extends DatabaseAccessor } Stream watchActiveProfile() { - return (profileEntries.select()..where((tbl) => tbl.active.equals(true))) + return (profileEntries.select() + ..where((tbl) => tbl.active.equals(true)) + ..limit(1)) .map(ProfileMapper.fromEntry) .watchSingleOrNull(); } @@ -82,8 +84,7 @@ class ProfilesDao extends DatabaseAccessor await transaction( () async { if (profile.active) { - await (update(profileEntries) - ..where((tbl) => tbl.id.isNotValue(profile.id))) + await update(profileEntries) .write(const ProfileEntriesCompanion(active: Value(false))); } await into(profileEntries).insert(profile.toCompanion()); @@ -95,8 +96,7 @@ class ProfilesDao extends DatabaseAccessor await transaction( () async { if (patch.active) { - await (update(profileEntries) - ..where((tbl) => tbl.id.isNotValue(patch.id))) + await update(profileEntries) .write(const ProfileEntriesCompanion(active: Value(false))); } await (update(profileEntries)..where((tbl) => tbl.id.equals(patch.id))) @@ -108,7 +108,7 @@ class ProfilesDao extends DatabaseAccessor Future setAsActive(String id) async { await transaction( () async { - await (update(profileEntries)..where((tbl) => tbl.id.isNotValue(id))) + await update(profileEntries) .write(const ProfileEntriesCompanion(active: Value(false))); await (update(profileEntries)..where((tbl) => tbl.id.equals(id))) .write(const ProfileEntriesCompanion(active: Value(true)));