diff --git a/easytier-gui/src-tauri/gen/android/app/src/main/AndroidManifest.xml b/easytier-gui/src-tauri/gen/android/app/src/main/AndroidManifest.xml index 2c1559f..d39174a 100644 --- a/easytier-gui/src-tauri/gen/android/app/src/main/AndroidManifest.xml +++ b/easytier-gui/src-tauri/gen/android/app/src/main/AndroidManifest.xml @@ -1,6 +1,10 @@ + + + + + + = Build.VERSION_CODES.O) { + startForegroundService(serviceIntent) + } else { + startService(serviceIntent) + } + } +} \ No newline at end of file diff --git a/easytier-gui/src-tauri/gen/android/app/src/main/java/com/kkrainbow/easytier/MainForegroundService.kt b/easytier-gui/src-tauri/gen/android/app/src/main/java/com/kkrainbow/easytier/MainForegroundService.kt new file mode 100644 index 0000000..5b29626 --- /dev/null +++ b/easytier-gui/src-tauri/gen/android/app/src/main/java/com/kkrainbow/easytier/MainForegroundService.kt @@ -0,0 +1,64 @@ +package com.kkrainbow.easytier +import android.app.Notification +import android.app.NotificationChannel +import android.app.NotificationManager +import android.app.Service +import android.content.Intent +import android.content.pm.ServiceInfo +import android.os.Build +import android.os.IBinder +import androidx.core.app.NotificationCompat +import android.util.Log + +class MainForegroundService : Service() { + companion object { + const val CHANNEL_ID = "easytier_channel" + const val NOTIFICATION_ID = 1355 + // You can add more constants if needed + } + + override fun onCreate() { + super.onCreate() + } + + override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { + createNotificationChannel() + val notification = NotificationCompat.Builder(this, CHANNEL_ID) + .setContentTitle("easytier Running") + .setContentText("easytier is available on localhost") + .setSmallIcon(android.R.drawable.ic_menu_manage) + .build() + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + startForeground( + NOTIFICATION_ID, + notification, + ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC + ) + } else { + startForeground(NOTIFICATION_ID, notification) + } + return START_STICKY + } + + override fun onDestroy() { + super.onDestroy() + } + + override fun onBind(intent: Intent?): IBinder? = null + + private fun createNotificationChannel() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + try { + val channel = NotificationChannel( + CHANNEL_ID, + "easytier notice", + NotificationManager.IMPORTANCE_DEFAULT + ) + val manager = getSystemService(NotificationManager::class.java) + manager?.createNotificationChannel(channel) + } catch (e: Exception) { + Log.e("MainForegroundService", "Failed to create notification channel", e) + } + } + } +} \ No newline at end of file diff --git a/easytier-gui/src/composables/mobile_vpn.ts b/easytier-gui/src/composables/mobile_vpn.ts index a1058cc..a231bde 100644 --- a/easytier-gui/src/composables/mobile_vpn.ts +++ b/easytier-gui/src/composables/mobile_vpn.ts @@ -115,6 +115,11 @@ function getRoutesForVpn(routes: Route[]): string[] { async function onNetworkInstanceChange() { console.error('vpn service watch network instance change ids', JSON.stringify(networkStore.networkInstanceIds)) const insts = networkStore.networkInstanceIds + const no_tun = networkStore.isNoTunEnabled(insts[0]) + if (no_tun) { + await doStopVpn() + return + } if (!insts) { await doStopVpn() return @@ -132,14 +137,6 @@ async function onNetworkInstanceChange() { return } - // if use no tun mode, stop the vpn service - const no_tun = networkStore.isNoTunEnabled(insts[0]) - if (no_tun) { - console.error('no tun mode, stop vpn service') - await doStopVpn() - return - } - let network_length = curNetworkInfo?.my_node_info?.virtual_ipv4.network_length if (!network_length) { network_length = 24 @@ -187,12 +184,26 @@ async function watchNetworkInstance() { console.error('vpn service watch network instance') } +function isNoTunEnabled(instanceId: string | undefined) { + if (!instanceId) { + return false + } + const no_tun = networkStore.isNoTunEnabled(instanceId) + if (no_tun) { + return true + } + return false +} + export async function initMobileVpnService() { await registerVpnServiceListener() await watchNetworkInstance() } -export async function prepareVpnService() { +export async function prepareVpnService(instanceId: string) { + if (isNoTunEnabled(instanceId)) { + return + } console.log('prepare vpn') const prepare_ret = await prepare_vpn() console.log('prepare vpn', JSON.stringify((prepare_ret))) diff --git a/easytier-gui/src/pages/index.vue b/easytier-gui/src/pages/index.vue index 80fafa5..adfc588 100644 --- a/easytier-gui/src/pages/index.vue +++ b/easytier-gui/src/pages/index.vue @@ -102,7 +102,7 @@ networkStore.$subscribe(async () => { async function runNetworkCb(cfg: NetworkTypes.NetworkConfig, cb: () => void) { if (type() === 'android') { - await prepareVpnService() + await prepareVpnService(cfg.instance_id) networkStore.clearNetworkInstances() } else {