add more log

This commit is contained in:
hiddify-com
2024-05-31 21:14:37 +02:00
parent d89184855d
commit dc22e75eb9
6 changed files with 71 additions and 44 deletions

View File

@@ -292,8 +292,8 @@ class BoxService(
} }
} }
} }
override fun postServiceClose(){ override fun postServiceClose() {
//TODO: // Not used on Android
} }
private suspend fun stopAndAlert(type: Alert, message: String? = null) { private suspend fun stopAndAlert(type: Alert, message: String? = null) {

View File

@@ -1,11 +1,12 @@
package com.hiddify.hiddify.bg package com.hiddify.hiddify.bg
import java.net.NetworkInterface
import android.net.Network import android.net.Network
import android.os.Build import android.os.Build
import com.hiddify.hiddify.Application import com.hiddify.hiddify.Application
import io.nekohasekai.libbox.InterfaceUpdateListener import io.nekohasekai.libbox.InterfaceUpdateListener
import java.net.NetworkInterface
object DefaultNetworkMonitor { object DefaultNetworkMonitor {
var defaultNetwork: Network? = null var defaultNetwork: Network? = null
@@ -27,6 +28,14 @@ object DefaultNetworkMonitor {
DefaultNetworkListener.stop(this) DefaultNetworkListener.stop(this)
} }
suspend fun require(): Network {
val network = defaultNetwork
if (network != null) {
return network
}
return DefaultNetworkListener.get()
}
fun setListener(listener: InterfaceUpdateListener?) { fun setListener(listener: InterfaceUpdateListener?) {
this.listener = listener this.listener = listener
checkDefaultInterfaceUpdate(defaultNetwork) checkDefaultInterfaceUpdate(defaultNetwork)
@@ -48,11 +57,11 @@ object DefaultNetworkMonitor {
continue continue
} }
listener.updateDefaultInterface(interfaceName, interfaceIndex) listener.updateDefaultInterface(interfaceName, interfaceIndex)
break
} }
} else { } else {
listener.updateDefaultInterface("", -1) listener.updateDefaultInterface("", -1)
} }
} }
} }

View File

@@ -27,6 +27,7 @@ object LocalResolver : LocalDNSTransport {
@RequiresApi(Build.VERSION_CODES.Q) @RequiresApi(Build.VERSION_CODES.Q)
override fun exchange(ctx: ExchangeContext, message: ByteArray) { override fun exchange(ctx: ExchangeContext, message: ByteArray) {
return runBlocking { return runBlocking {
val defaultNetwork = DefaultNetworkMonitor.require()
suspendCoroutine { continuation -> suspendCoroutine { continuation ->
val signal = CancellationSignal() val signal = CancellationSignal()
ctx.onCancel(signal::cancel) ctx.onCancel(signal::cancel)
@@ -52,7 +53,7 @@ object LocalResolver : LocalDNSTransport {
} }
} }
DnsResolver.getInstance().rawQuery( DnsResolver.getInstance().rawQuery(
DefaultNetworkMonitor.defaultNetwork, defaultNetwork,
message, message,
DnsResolver.FLAG_NO_RETRY, DnsResolver.FLAG_NO_RETRY,
Dispatchers.IO.asExecutor(), Dispatchers.IO.asExecutor(),
@@ -64,8 +65,9 @@ object LocalResolver : LocalDNSTransport {
} }
override fun lookup(ctx: ExchangeContext, network: String, domain: String) { 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 -> suspendCoroutine { continuation ->
val signal = CancellationSignal() val signal = CancellationSignal()
ctx.onCancel(signal::cancel) ctx.onCancel(signal::cancel)
@@ -99,7 +101,7 @@ object LocalResolver : LocalDNSTransport {
} }
if (type != null) { if (type != null) {
DnsResolver.getInstance().query( DnsResolver.getInstance().query(
DefaultNetworkMonitor.defaultNetwork, defaultNetwork,
domain, domain,
type, type,
DnsResolver.FLAG_NO_RETRY, DnsResolver.FLAG_NO_RETRY,
@@ -109,7 +111,7 @@ object LocalResolver : LocalDNSTransport {
) )
} else { } else {
DnsResolver.getInstance().query( DnsResolver.getInstance().query(
DefaultNetworkMonitor.defaultNetwork, defaultNetwork,
domain, domain,
DnsResolver.FLAG_NO_RETRY, DnsResolver.FLAG_NO_RETRY,
Dispatchers.IO.asExecutor(), 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"))
} }
} }
} }

View File

@@ -79,6 +79,7 @@
}, },
"manually": "Manual Entry", "manually": "Manual Entry",
"addWarp": "Add Warp", "addWarp": "Add Warp",
"addingWarpMsg": "Please wait while we register WARP.",
"addingProfileMsg": "Adding Profile", "addingProfileMsg": "Adding Profile",
"failureMsg": "Failed to Add Profile" "failureMsg": "Failed to Add Profile"

View File

@@ -54,12 +54,12 @@
"updatedTimeAgo": "${timeago} به‌روزرسانی شد", "updatedTimeAgo": "${timeago} به‌روزرسانی شد",
"remainingDuration": "${duration} روز باقی مانده", "remainingDuration": "${duration} روز باقی مانده",
"remainingTrafficSemanticLabel": "${consumed} از ${total} ترافیک مصرف شده", "remainingTrafficSemanticLabel": "${consumed} از ${total} ترافیک مصرف شده",
"expired": "منقضی شده", "expired": "پایان زمان مجاز",
"noTraffic": "اتمام سهمیه", "noTraffic": "پایان حجم مجاز",
"upload": "آپلود", "upload": "آپلود",
"download": "دانلود", "download": "دانلود",
"total": "کل ترافیک", "total": "کل ترافیک",
"expireDate": "تاریخ انقضاء" "expireDate": "تاریخ پایان"
}, },
"sortBy": { "sortBy": {
"lastUpdate": "اخیراً به‌روز شده", "lastUpdate": "اخیراً به‌روز شده",

View File

@@ -5,6 +5,7 @@ import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:gap/gap.dart'; import 'package:gap/gap.dart';
import 'package:go_router/go_router.dart'; import 'package:go_router/go_router.dart';
import 'package:hiddify/core/localization/translations.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/preferences/preferences_provider.dart';
import 'package:hiddify/core/router/router.dart'; import 'package:hiddify/core/router/router.dart';
import 'package:hiddify/features/common/qr_code_scanner_screen.dart'; import 'package:hiddify/features/common/qr_code_scanner_screen.dart';
@@ -162,28 +163,7 @@ class AddProfileModal extends HookConsumerWidget {
child: InkWell( child: InkWell(
onTap: () async { onTap: () async {
Future.microtask(() async { Future.microtask(() async {
context.pop(); addProfileModal(context, ref);
final _prefs = ref.read(sharedPreferencesProvider).requireValue;
final consent = _prefs.getBool(warpConsentGiven) ?? false;
if (!consent) {
final agreed = await showDialog<bool>(
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"); //
}); });
}, },
child: Row( 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<bool>(
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 { class _Button extends StatelessWidget {