import 'dart:async'; import 'dart:io'; import 'package:fl_clash/common/common.dart'; import 'package:path/path.dart'; import 'package:path_provider/path_provider.dart'; class AppPath { static AppPath? _instance; Completer dataDir = Completer(); Completer downloadDir = Completer(); Completer tempDir = Completer(); late String appDirPath; AppPath._internal() { appDirPath = join(dirname(Platform.resolvedExecutable)); getApplicationSupportDirectory().then((value) { dataDir.complete(value); }); getTemporaryDirectory().then((value) { tempDir.complete(value); }); getDownloadsDirectory().then((value) { downloadDir.complete(value); }); } factory AppPath() { _instance ??= AppPath._internal(); return _instance!; } String get executableExtension { return Platform.isWindows ? ".exe" : ""; } String get executableDirPath { final currentExecutablePath = Platform.resolvedExecutable; return dirname(currentExecutablePath); } String get corePath { return join(executableDirPath, "FlClashCore$executableExtension"); } String get helperPath { return join(executableDirPath, "$appHelperService$executableExtension"); } Future get downloadDirPath async { final directory = await downloadDir.future; return directory.path; } Future get homeDirPath async { final directory = await dataDir.future; return directory.path; } Future get lockFilePath async { final directory = await dataDir.future; return join(directory.path, "FlClash.lock"); } Future get sharedPreferencesPath async { final directory = await dataDir.future; return join(directory.path, "shared_preferences.json"); } Future get profilesPath async { final directory = await dataDir.future; return join(directory.path, profilesDirectoryName); } Future getProfilePath(String id) async { final directory = await profilesPath; return join(directory, "$id.yaml"); } Future getProvidersDirPath(String id) async { final directory = await profilesPath; return join( directory, "providers", id, ); } Future getProvidersFilePath( String id, String type, String url, ) async { final directory = await profilesPath; return join( directory, "providers", id, type, url.toMd5(), ); } Future get tempPath async { final directory = await tempDir.future; return directory.path; } } final appPath = AppPath();