fix: смена иконки через нативный MethodChannel — без плагина и без отключения MainActivity

This commit is contained in:
klockky
2026-05-28 05:13:14 +00:00
parent 73208bda49
commit c6b0cba08f
7 changed files with 101 additions and 21 deletions
+9 -4
View File
@@ -9,9 +9,6 @@
android:label="Komet"
android:name="${applicationName}"
android:icon="@mipmap/ic_launcher">
<service
android:name="com.solusibejo.flutter_dynamic_icon_plus.FlutterDynamicIconPlusService"
android:stopWithTask="false"/>
<activity
android:name=".MainActivity"
android:exported="true"
@@ -29,11 +26,19 @@
android:name="io.flutter.embedding.android.NormalTheme"
android:resource="@style/NormalTheme"
/>
</activity>
<activity-alias
android:name=".DefaultIcon"
android:enabled="true"
android:exported="true"
android:icon="@mipmap/ic_launcher"
android:label="Komet"
android:targetActivity=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</activity-alias>
<activity-alias
android:name=".MinimalIcon"
android:enabled="false"
@@ -1,7 +1,9 @@
package ru.komet.app
import android.content.ComponentName
import android.content.Context
import android.content.Intent
import android.content.pm.PackageManager
import android.net.ConnectivityManager
import android.net.Network
import android.net.NetworkCapabilities
@@ -20,11 +22,32 @@ import java.util.concurrent.atomic.AtomicBoolean
class MainActivity : FlutterActivity() {
private val channelName = "ru.komet.app/vpn_bypass"
private val iconAliases = listOf("DefaultIcon", "MinimalIcon")
private companion object {
const val LOG_TAG = "VpnBypass"
}
private fun applyIcon(name: String) {
val pm = packageManager
for (alias in iconAliases) {
val component = ComponentName(packageName, "$packageName.$alias")
val state = if (alias == name) {
PackageManager.COMPONENT_ENABLED_STATE_ENABLED
} else {
PackageManager.COMPONENT_ENABLED_STATE_DISABLED
}
pm.setComponentEnabledSetting(
component,
state,
PackageManager.DONT_KILL_APP,
)
}
Handler(Looper.getMainLooper()).postDelayed({
finishAndRemoveTask()
}, 250L)
}
override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
super.configureFlutterEngine(flutterEngine)
MethodChannel(
@@ -39,6 +62,28 @@ class MainActivity : FlutterActivity() {
}
}
MethodChannel(
flutterEngine.dartExecutor.binaryMessenger,
"ru.komet.app/app_icon",
).setMethodCallHandler { call, result ->
when (call.method) {
"setAppIcon" -> {
val name = call.argument<String>("name")
if (name == null || !iconAliases.contains(name)) {
result.error("INVALID_ICON", "Unknown icon: $name", null)
return@setMethodCallHandler
}
try {
applyIcon(name)
result.success(null)
} catch (e: Exception) {
result.error("APPLY_FAILED", e.message, null)
}
}
else -> result.notImplemented()
}
}
MethodChannel(
flutterEngine.dartExecutor.binaryMessenger,
"ru.komet.app/upload_service",