add more log
This commit is contained in:
@@ -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) {
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -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"))
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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"
|
||||||
|
|
||||||
|
|||||||
@@ -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": "اخیراً بهروز شده",
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user