From 635e11c519fab60c48b5c62898195db9ae15ec8e Mon Sep 17 00:00:00 2001 From: problematicconsumer Date: Sat, 14 Oct 2023 17:44:18 +0330 Subject: [PATCH] Fix android bugs --- android/app/src/main/AndroidManifest.xml | 36 ++++++------- .../kotlin/com/hiddify/hiddify/LogHandler.kt | 5 +- .../com/hiddify/hiddify/MainActivity.kt | 3 +- .../com/hiddify/hiddify/MethodHandler.kt | 50 +++++++++++++------ .../hiddify/PlatformSettingsHandler.kt | 13 +++-- .../kotlin/com/hiddify/hiddify/Settings.kt | 4 +- 6 files changed, 63 insertions(+), 48 deletions(-) diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index d5e0a339..6a2a2a4c 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -15,9 +15,9 @@ + android:name="io.flutter.embedding.android.NormalTheme" + android:resource="@style/NormalTheme" /> + - - + + - - - - - - - + + + + + + + + @@ -104,8 +105,7 @@ - + android:exported="false"> + MainActivity.instance.serviceLogs.observeForever { if (it == null) return@observeForever events?.success(it) } diff --git a/android/app/src/main/kotlin/com/hiddify/hiddify/MainActivity.kt b/android/app/src/main/kotlin/com/hiddify/hiddify/MainActivity.kt index 1d3165f3..f2253b36 100644 --- a/android/app/src/main/kotlin/com/hiddify/hiddify/MainActivity.kt +++ b/android/app/src/main/kotlin/com/hiddify/hiddify/MainActivity.kt @@ -8,7 +8,6 @@ import android.net.VpnService import android.os.Build import android.util.Log import androidx.core.app.ActivityCompat -import androidx.core.app.NotificationManagerCompat import androidx.core.content.ContextCompat import androidx.lifecycle.MutableLiveData import androidx.lifecycle.lifecycleScope @@ -46,7 +45,7 @@ class MainActivity : FlutterFragmentActivity(), ServiceConnection.Callback { super.configureFlutterEngine(flutterEngine) instance = this reconnect() - flutterEngine.plugins.add(MethodHandler()) + flutterEngine.plugins.add(MethodHandler(lifecycleScope)) flutterEngine.plugins.add(PlatformSettingsHandler()) flutterEngine.plugins.add(EventHandler()) flutterEngine.plugins.add(LogHandler()) 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 76cde119..944c52f7 100644 --- a/android/app/src/main/kotlin/com/hiddify/hiddify/MethodHandler.kt +++ b/android/app/src/main/kotlin/com/hiddify/hiddify/MethodHandler.kt @@ -1,6 +1,6 @@ package com.hiddify.hiddify -import androidx.annotation.NonNull +import android.util.Log import com.hiddify.hiddify.bg.BoxService import com.hiddify.hiddify.constant.Status import io.flutter.embedding.engine.plugins.FlutterPlugin @@ -8,14 +8,17 @@ import io.flutter.plugin.common.MethodCall import io.flutter.plugin.common.MethodChannel import io.flutter.plugin.common.StandardMethodCodec import io.nekohasekai.libbox.Libbox -import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.delay import kotlinx.coroutines.launch -class MethodHandler : FlutterPlugin, MethodChannel.MethodCallHandler { +class MethodHandler(private val scope: CoroutineScope) : FlutterPlugin, + MethodChannel.MethodCallHandler { private var channel: MethodChannel? = null companion object { + const val TAG = "A/MethodHandler" const val channelName = "com.hiddify.app/method" enum class Trigger(val method: String) { @@ -29,7 +32,7 @@ class MethodHandler : FlutterPlugin, MethodChannel.MethodCallHandler { } } - override fun onAttachedToEngine(@NonNull flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) { + override fun onAttachedToEngine(flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) { val taskQueue = flutterPluginBinding.binaryMessenger.makeBackgroundTaskQueue() channel = MethodChannel( flutterPluginBinding.binaryMessenger, @@ -47,7 +50,7 @@ class MethodHandler : FlutterPlugin, MethodChannel.MethodCallHandler { override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) { when (call.method) { Trigger.ParseConfig.method -> { - GlobalScope.launch { + scope.launch(Dispatchers.IO) { result.runCatching { val args = call.arguments as Map<*, *> val path = args["path"] as String @@ -68,19 +71,35 @@ class MethodHandler : FlutterPlugin, MethodChannel.MethodCallHandler { } Trigger.Start.method -> { - val args = call.arguments as Map<*, *> - Settings.activeConfigPath = args["path"] as String? ?: "" - MainActivity.instance.startService() - result.success(true) + result.runCatching { + val args = call.arguments as Map<*, *> + Settings.activeConfigPath = args["path"] as String? ?: "" + val mainActivity = MainActivity.instance + val started = mainActivity.serviceStatus.value == Status.Started + if (started) { + Log.w(TAG, "service is already running") + return success(true) + } + mainActivity.startService() + success(true) + } } Trigger.Stop.method -> { - BoxService.stop() - result.success(true) + result.runCatching { + val mainActivity = MainActivity.instance + val started = mainActivity.serviceStatus.value == Status.Started + if (!started) { + Log.w(TAG, "service is not running") + return success(true) + } + BoxService.stop() + success(true) + } } Trigger.Restart.method -> { - GlobalScope.launch { + scope.launch(Dispatchers.IO) { result.runCatching { val args = call.arguments as Map<*, *> Settings.activeConfigPath = args["path"] as String? ?: "" @@ -93,8 +112,7 @@ class MethodHandler : FlutterPlugin, MethodChannel.MethodCallHandler { BoxService.stop() delay(200L) mainActivity.startService() - success(true) - return@launch + return@launch success(true) } runCatching { Libbox.newStandaloneCommandClient().serviceReload() @@ -107,7 +125,7 @@ class MethodHandler : FlutterPlugin, MethodChannel.MethodCallHandler { } Trigger.SelectOutbound.method -> { - GlobalScope.launch { + scope.launch { result.runCatching { val args = call.arguments as Map<*, *> Libbox.newStandaloneCommandClient() @@ -121,7 +139,7 @@ class MethodHandler : FlutterPlugin, MethodChannel.MethodCallHandler { } Trigger.UrlTest.method -> { - GlobalScope.launch { + scope.launch { result.runCatching { val args = call.arguments as Map<*, *> Libbox.newStandaloneCommandClient() 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 d22765da..cd1722d1 100644 --- a/android/app/src/main/kotlin/com/hiddify/hiddify/PlatformSettingsHandler.kt +++ b/android/app/src/main/kotlin/com/hiddify/hiddify/PlatformSettingsHandler.kt @@ -1,18 +1,16 @@ package com.hiddify.hiddify import android.Manifest +import android.annotation.SuppressLint import android.app.Activity import android.content.Intent import android.content.pm.ApplicationInfo import android.content.pm.PackageManager import android.graphics.Bitmap import android.graphics.Canvas -import android.graphics.drawable.VectorDrawable import android.net.Uri import android.os.Build import android.util.Base64 -import androidx.annotation.NonNull -import androidx.core.graphics.drawable.toBitmap import com.google.gson.Gson import com.google.gson.annotations.SerializedName import com.hiddify.hiddify.Application.Companion.packageManager @@ -48,7 +46,7 @@ class PlatformSettingsHandler : FlutterPlugin, MethodChannel.MethodCallHandler, } } - override fun onAttachedToEngine(@NonNull flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) { + override fun onAttachedToEngine(flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) { val taskQueue = flutterPluginBinding.binaryMessenger.makeBackgroundTaskQueue() channel = MethodChannel( flutterPluginBinding.binaryMessenger, @@ -69,7 +67,7 @@ class PlatformSettingsHandler : FlutterPlugin, MethodChannel.MethodCallHandler, } override fun onDetachedFromActivityForConfigChanges() { - activity = null; + activity = null } override fun onReattachedToActivityForConfigChanges(binding: ActivityPluginBinding) { @@ -78,7 +76,7 @@ class PlatformSettingsHandler : FlutterPlugin, MethodChannel.MethodCallHandler, } override fun onDetachedFromActivity() { - activity = null; + activity = null } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?): Boolean { @@ -95,6 +93,7 @@ class PlatformSettingsHandler : FlutterPlugin, MethodChannel.MethodCallHandler, @SerializedName("is-system-app") val isSystemApp: Boolean ) + @SuppressLint("BatteryLife") override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) { when (call.method) { Trigger.IsIgnoringBatteryOptimizations.method -> { @@ -166,7 +165,7 @@ class PlatformSettingsHandler : FlutterPlugin, MethodChannel.MethodCallHandler, result.runCatching { val args = call.arguments as Map<*, *> val packageName = - args["packageName"] as String? ?: return error("provide packageName") + args["packageName"] as String val drawable = packageManager.getApplicationIcon(packageName) val bitmap = Bitmap.createBitmap( drawable.intrinsicWidth, diff --git a/android/app/src/main/kotlin/com/hiddify/hiddify/Settings.kt b/android/app/src/main/kotlin/com/hiddify/hiddify/Settings.kt index e801a26a..b5e64c2f 100644 --- a/android/app/src/main/kotlin/com/hiddify/hiddify/Settings.kt +++ b/android/app/src/main/kotlin/com/hiddify/hiddify/Settings.kt @@ -32,9 +32,9 @@ object Settings { val perAppProxyList: List get() { val stringValue = if (perAppProxyMode == PerAppProxyMode.INCLUDE) { - preferences.getString(SettingsKey.PER_APP_PROXY_INCLUDE_LIST, "")!!; + preferences.getString(SettingsKey.PER_APP_PROXY_INCLUDE_LIST, "")!! } else { - preferences.getString(SettingsKey.PER_APP_PROXY_EXCLUDE_LIST, "")!!; + preferences.getString(SettingsKey.PER_APP_PROXY_EXCLUDE_LIST, "")!! } if (!stringValue.startsWith(LIST_IDENTIFIER)) { return emptyList()