From dc22e75eb9170d31b84da6da3285ab3776c63d0a Mon Sep 17 00:00:00 2001 From: hiddify-com <114227601+hiddify-com@users.noreply.github.com> Date: Fri, 31 May 2024 21:14:37 +0200 Subject: [PATCH] add more log --- .../com/hiddify/hiddify/bg/BoxService.kt | 4 +- .../hiddify/bg/DefaultNetworkMonitor.kt | 13 +++- .../com/hiddify/hiddify/bg/LocalResolver.kt | 30 ++++----- assets/translations/strings_en.i18n.json | 1 + assets/translations/strings_fa.i18n.json | 6 +- .../profile/add/add_profile_modal.dart | 61 ++++++++++++------- 6 files changed, 71 insertions(+), 44 deletions(-) diff --git a/android/app/src/main/kotlin/com/hiddify/hiddify/bg/BoxService.kt b/android/app/src/main/kotlin/com/hiddify/hiddify/bg/BoxService.kt index 0935bc1a..8045d9ff 100644 --- a/android/app/src/main/kotlin/com/hiddify/hiddify/bg/BoxService.kt +++ b/android/app/src/main/kotlin/com/hiddify/hiddify/bg/BoxService.kt @@ -292,8 +292,8 @@ class BoxService( } } } - override fun postServiceClose(){ - //TODO: + override fun postServiceClose() { + // Not used on Android } private suspend fun stopAndAlert(type: Alert, message: String? = null) { diff --git a/android/app/src/main/kotlin/com/hiddify/hiddify/bg/DefaultNetworkMonitor.kt b/android/app/src/main/kotlin/com/hiddify/hiddify/bg/DefaultNetworkMonitor.kt index cc479378..65e385fe 100644 --- a/android/app/src/main/kotlin/com/hiddify/hiddify/bg/DefaultNetworkMonitor.kt +++ b/android/app/src/main/kotlin/com/hiddify/hiddify/bg/DefaultNetworkMonitor.kt @@ -1,11 +1,12 @@ package com.hiddify.hiddify.bg -import java.net.NetworkInterface import android.net.Network import android.os.Build import com.hiddify.hiddify.Application import io.nekohasekai.libbox.InterfaceUpdateListener +import java.net.NetworkInterface + object DefaultNetworkMonitor { var defaultNetwork: Network? = null @@ -27,6 +28,14 @@ object DefaultNetworkMonitor { DefaultNetworkListener.stop(this) } + suspend fun require(): Network { + val network = defaultNetwork + if (network != null) { + return network + } + return DefaultNetworkListener.get() + } + fun setListener(listener: InterfaceUpdateListener?) { this.listener = listener checkDefaultInterfaceUpdate(defaultNetwork) @@ -48,11 +57,11 @@ object DefaultNetworkMonitor { continue } listener.updateDefaultInterface(interfaceName, interfaceIndex) - break } } else { listener.updateDefaultInterface("", -1) } } + } \ No newline at end of file diff --git a/android/app/src/main/kotlin/com/hiddify/hiddify/bg/LocalResolver.kt b/android/app/src/main/kotlin/com/hiddify/hiddify/bg/LocalResolver.kt index 06c262f5..a5d95f23 100644 --- a/android/app/src/main/kotlin/com/hiddify/hiddify/bg/LocalResolver.kt +++ b/android/app/src/main/kotlin/com/hiddify/hiddify/bg/LocalResolver.kt @@ -27,6 +27,7 @@ object LocalResolver : LocalDNSTransport { @RequiresApi(Build.VERSION_CODES.Q) override fun exchange(ctx: ExchangeContext, message: ByteArray) { return runBlocking { + val defaultNetwork = DefaultNetworkMonitor.require() suspendCoroutine { continuation -> val signal = CancellationSignal() ctx.onCancel(signal::cancel) @@ -52,7 +53,7 @@ object LocalResolver : LocalDNSTransport { } } DnsResolver.getInstance().rawQuery( - DefaultNetworkMonitor.defaultNetwork, + defaultNetwork, message, DnsResolver.FLAG_NO_RETRY, Dispatchers.IO.asExecutor(), @@ -64,8 +65,9 @@ object LocalResolver : LocalDNSTransport { } override fun lookup(ctx: ExchangeContext, network: String, domain: String) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { - return runBlocking { + return runBlocking { + val defaultNetwork = DefaultNetworkMonitor.require() + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { suspendCoroutine { continuation -> val signal = CancellationSignal() ctx.onCancel(signal::cancel) @@ -99,7 +101,7 @@ object LocalResolver : LocalDNSTransport { } if (type != null) { DnsResolver.getInstance().query( - DefaultNetworkMonitor.defaultNetwork, + defaultNetwork, domain, type, DnsResolver.FLAG_NO_RETRY, @@ -109,7 +111,7 @@ object LocalResolver : LocalDNSTransport { ) } else { DnsResolver.getInstance().query( - DefaultNetworkMonitor.defaultNetwork, + defaultNetwork, domain, DnsResolver.FLAG_NO_RETRY, Dispatchers.IO.asExecutor(), @@ -118,17 +120,15 @@ object LocalResolver : LocalDNSTransport { ) } } + } else { + val answer = try { + defaultNetwork.getAllByName(domain) + } catch (e: UnknownHostException) { + ctx.errorCode(RCODE_NXDOMAIN) + return@runBlocking + } + ctx.success(answer.mapNotNull { it.hostAddress }.joinToString("\n")) } - } else { - val underlyingNetwork = - DefaultNetworkMonitor.defaultNetwork ?: error("upstream network not found") - val answer = try { - underlyingNetwork.getAllByName(domain) - } catch (e: UnknownHostException) { - ctx.errorCode(RCODE_NXDOMAIN) - return - } - ctx.success(answer.mapNotNull { it.hostAddress }.joinToString("\n")) } } } \ No newline at end of file diff --git a/assets/translations/strings_en.i18n.json b/assets/translations/strings_en.i18n.json index 830c2ff1..c36c5f38 100644 --- a/assets/translations/strings_en.i18n.json +++ b/assets/translations/strings_en.i18n.json @@ -79,6 +79,7 @@ }, "manually": "Manual Entry", "addWarp": "Add Warp", + "addingWarpMsg": "Please wait while we register WARP.", "addingProfileMsg": "Adding Profile", "failureMsg": "Failed to Add Profile" diff --git a/assets/translations/strings_fa.i18n.json b/assets/translations/strings_fa.i18n.json index 60dd17c9..82a821c5 100644 --- a/assets/translations/strings_fa.i18n.json +++ b/assets/translations/strings_fa.i18n.json @@ -54,12 +54,12 @@ "updatedTimeAgo": "${timeago} به‌روزرسانی شد", "remainingDuration": "${duration} روز باقی مانده", "remainingTrafficSemanticLabel": "${consumed} از ${total} ترافیک مصرف شده", - "expired": "منقضی شده", - "noTraffic": "اتمام سهمیه", + "expired": "پایان زمان مجاز", + "noTraffic": "پایان حجم مجاز", "upload": "آپلود", "download": "دانلود", "total": "کل ترافیک", - "expireDate": "تاریخ انقضاء" + "expireDate": "تاریخ پایان" }, "sortBy": { "lastUpdate": "اخیراً به‌روز شده", diff --git a/lib/features/profile/add/add_profile_modal.dart b/lib/features/profile/add/add_profile_modal.dart index 7e5989ad..a9bd6ef6 100644 --- a/lib/features/profile/add/add_profile_modal.dart +++ b/lib/features/profile/add/add_profile_modal.dart @@ -5,6 +5,7 @@ import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:gap/gap.dart'; import 'package:go_router/go_router.dart'; import 'package:hiddify/core/localization/translations.dart'; +import 'package:hiddify/core/notification/in_app_notification_controller.dart'; import 'package:hiddify/core/preferences/preferences_provider.dart'; import 'package:hiddify/core/router/router.dart'; import 'package:hiddify/features/common/qr_code_scanner_screen.dart'; @@ -162,28 +163,7 @@ class AddProfileModal extends HookConsumerWidget { child: InkWell( onTap: () async { Future.microtask(() async { - context.pop(); - final _prefs = ref.read(sharedPreferencesProvider).requireValue; - final consent = _prefs.getBool(warpConsentGiven) ?? false; - if (!consent) { - final agreed = await showDialog( - context: context, - builder: (context) => const WarpLicenseAgreementModal(), - ); - - if (agreed ?? false) { - await ref.read(warpOptionNotifierProvider.notifier).agree(); - } - } - - final accountId = _prefs.getString("warp2-account-id"); - final accessToken = _prefs.getString("warp2-access-token"); - final hasWarp2Config = accountId != null && accessToken != null; - - if (!hasWarp2Config) { - await ref.read(warpOptionNotifierProvider.notifier).generateWarp2Config(); - } - await ref.read(addProfileProvider.notifier).add("#profile-title: Hiddify WARP\nwarp://p2@auto#Remote&&detour=warp://p1@auto#Local"); // + addProfileModal(context, ref); }); }, child: Row( @@ -259,6 +239,43 @@ class AddProfileModal extends HookConsumerWidget { ), ); } + + void addProfileModal(BuildContext context, WidgetRef ref) async { + final _prefs = ref.read(sharedPreferencesProvider).requireValue; + final _warp = ref.read(warpOptionNotifierProvider.notifier); + final _profile = ref.read(addProfileProvider.notifier); + final consent = _prefs.getBool(warpConsentGiven) ?? false; + context.pop(); + Future.microtask(() async { + final t = ref.read(translationsProvider); + final notification = ref.read(inAppNotificationControllerProvider); + + if (!consent) { + final agreed = await showDialog( + context: context, + builder: (context) => const WarpLicenseAgreementModal(), + ); + + if (agreed ?? false) { + await _prefs.setBool(warpConsentGiven, true); + notification.showInfoToast(t.profile.add.addingWarpMsg); + await _warp.generateWarpConfig(); + } else { + return null; + } + } + + final accountId = _prefs.getString("warp2-account-id"); + final accessToken = _prefs.getString("warp2-access-token"); + final hasWarp2Config = accountId != null && accessToken != null; + + if (!hasWarp2Config) { + notification.showInfoToast(t.profile.add.addingWarpMsg); + await _warp.generateWarp2Config(); + } + await _profile.add("#profile-title: Hiddify WARP\nwarp://p2@auto#Remote&&detour=warp://p1@auto#Local"); // + }); + } } class _Button extends StatelessWidget {