Support core status check and force restart Optimize proxies page and access page Update flutter and pub dependencies Update go version Optimize more details
107 lines
2.8 KiB
Dart
107 lines
2.8 KiB
Dart
import 'dart:async';
|
|
import 'dart:convert';
|
|
import 'dart:io';
|
|
import 'dart:isolate';
|
|
|
|
import 'package:fl_clash/common/app_localizations.dart';
|
|
import 'package:fl_clash/common/constant.dart';
|
|
import 'package:fl_clash/common/system.dart';
|
|
import 'package:fl_clash/models/models.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:flutter/services.dart';
|
|
|
|
class App {
|
|
static App? _instance;
|
|
late MethodChannel methodChannel;
|
|
Function()? onExit;
|
|
|
|
App._internal() {
|
|
methodChannel = const MethodChannel('$packageName/app');
|
|
methodChannel.setMethodCallHandler((call) async {
|
|
switch (call.method) {
|
|
case 'exit':
|
|
if (onExit != null) {
|
|
await onExit!();
|
|
}
|
|
default:
|
|
throw MissingPluginException();
|
|
}
|
|
});
|
|
}
|
|
|
|
factory App() {
|
|
_instance ??= App._internal();
|
|
return _instance!;
|
|
}
|
|
|
|
Future<bool?> moveTaskToBack() async {
|
|
return await methodChannel.invokeMethod<bool>('moveTaskToBack');
|
|
}
|
|
|
|
Future<List<Package>> getPackages() async {
|
|
final packagesString = await methodChannel.invokeMethod<String>(
|
|
'getPackages',
|
|
);
|
|
return Isolate.run<List<Package>>(() {
|
|
final List<dynamic> packagesRaw = packagesString != null
|
|
? json.decode(packagesString)
|
|
: [];
|
|
return packagesRaw.map((e) => Package.fromJson(e)).toSet().toList();
|
|
});
|
|
}
|
|
|
|
Future<List<String>> getChinaPackageNames() async {
|
|
final packageNamesString = await methodChannel.invokeMethod<String>(
|
|
'getChinaPackageNames',
|
|
);
|
|
return Isolate.run<List<String>>(() {
|
|
final List<dynamic> packageNamesRaw = packageNamesString != null
|
|
? json.decode(packageNamesString)
|
|
: [];
|
|
return packageNamesRaw.map((e) => e.toString()).toList();
|
|
});
|
|
}
|
|
|
|
Future<bool?> requestNotificationsPermission() async {
|
|
return await methodChannel.invokeMethod<bool>(
|
|
'requestNotificationsPermission',
|
|
);
|
|
}
|
|
|
|
Future<bool> openFile(String path) async {
|
|
return await methodChannel.invokeMethod<bool>('openFile', {'path': path}) ??
|
|
false;
|
|
}
|
|
|
|
Future<ImageProvider?> getPackageIcon(String packageName) async {
|
|
final path = await methodChannel.invokeMethod<String>('getPackageIcon', {
|
|
'packageName': packageName,
|
|
});
|
|
if (path == null) {
|
|
return null;
|
|
}
|
|
return FileImage(File(path));
|
|
}
|
|
|
|
Future<bool?> tip(String? message) async {
|
|
return await methodChannel.invokeMethod<bool>('tip', {
|
|
'message': '$message',
|
|
});
|
|
}
|
|
|
|
Future<bool?> initShortcuts() async {
|
|
return await methodChannel.invokeMethod<bool>(
|
|
'initShortcuts',
|
|
appLocalizations.toggle,
|
|
);
|
|
}
|
|
|
|
Future<bool?> updateExcludeFromRecents(bool value) async {
|
|
return await methodChannel.invokeMethod<bool>('updateExcludeFromRecents', {
|
|
'value': value,
|
|
});
|
|
}
|
|
}
|
|
|
|
final app = system.isAndroid ? App() : null;
|