mirror of
				https://github.com/ImranR98/Obtainium.git
				synced 2025-10-31 13:33:28 +01:00 
			
		
		
		
	Compare commits
	
		
			27 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | d32befb832 | ||
|  | 94d8295992 | ||
|  | dcf9f5732a | ||
|  | c89790d58f | ||
|  | 3633c58bea | ||
|  | 9770501aec | ||
|  | 167d0ccced | ||
|  | 430d1f2690 | ||
|  | eb21ba3f6e | ||
|  | 3ab14e2311 | ||
|  | fff3b22e74 | ||
|  | 46354e648a | ||
|  | 4f67ba3f3b | ||
|  | e5db702a67 | ||
|  | 53451fd883 | ||
|  | 491d3cb723 | ||
|  | 6c7644c9b3 | ||
|  | 8539581fe9 | ||
|  | f301f6cedb | ||
|  | 93c8bca038 | ||
|  | 0961e044a7 | ||
|  | 03f50e501e | ||
|  | 21dacb6171 | ||
|  | 16ecc88fcd | ||
|  | 1f829289ed | ||
|  | be739b7639 | ||
|  | 4b66aefb33 | 
							
								
								
									
										2
									
								
								.flutter
									
									
									
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								.flutter
									
									
									
									
									
								
							 Submodule .flutter updated: c519ee916e...35c388afb5
									
								
							
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -45,6 +45,7 @@ app.*.map.json | ||||
| /android/app/debug | ||||
| /android/app/profile | ||||
| /android/app/release | ||||
| /android/app/.cxx | ||||
|  | ||||
| # Custom | ||||
| TODO.txt | ||||
| @@ -29,11 +29,12 @@ Currently supported App sources: | ||||
|   - [Uptodown](https://uptodown.com/) | ||||
|   - [Huawei AppGallery](https://appgallery.huawei.com/) | ||||
|   - [Tencent App Store](https://sj.qq.com/) | ||||
|   - [RuStore](https://rustore.ru/) | ||||
|   - Jenkins Jobs | ||||
|   - [APKMirror](https://apkmirror.com/) (Track-Only) | ||||
| - Other - App-Specific: | ||||
|   - [Telegram App](https://telegram.org) | ||||
|   - [Neutron Code](https://neutroncode.com) | ||||
|   - [Telegram App](https://telegram.org/) | ||||
|   - [Neutron Code](https://neutroncode.com/) | ||||
| - Direct APK Link | ||||
| - "HTML" (Fallback): Any other URL that returns an HTML page with links to APK files | ||||
|  | ||||
|   | ||||
							
								
								
									
										
											BIN
										
									
								
								assets/fonts/Montserrat-Regular.ttf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								assets/fonts/Montserrat-Regular.ttf
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							| @@ -255,7 +255,7 @@ | ||||
|     "intermediateLinkNotFound": "Intermediate veza nije nađena", | ||||
|     "intermediateLink": "Intermediate veza", | ||||
|     "exemptFromBackgroundUpdates": "Izuzmi iz ažuriranja u pozadini (ako su uključeni)", | ||||
|     "bgUpdatesOnWiFiOnly": "Isključite ažuriranje u pozadini kada niste na WiFi-ju", | ||||
|     "bgUpdatesOnWiFiOnly": "Isključite ažuriranje u pozadini kada niste naWi-Fi-ju", | ||||
|     "bgUpdatesWhileChargingOnly": "Disable background updates when not charging", | ||||
|     "autoSelectHighestVersionCode": "Automatski izaberite najveću (verziju) versionCode APK-a", | ||||
|     "versionExtractionRegEx": "RegEx ekstrakcija verzije", | ||||
|   | ||||
| @@ -255,7 +255,7 @@ | ||||
|     "intermediateLinkNotFound": "Intermediate link not found", | ||||
|     "intermediateLink": "Intermediate link", | ||||
|     "exemptFromBackgroundUpdates": "Exempt from background updates (if enabled)", | ||||
|     "bgUpdatesOnWiFiOnly": "Disable background updates when not on WiFi", | ||||
|     "bgUpdatesOnWiFiOnly": "Disable background updates when not onWi-Fi", | ||||
|     "bgUpdatesWhileChargingOnly": "Disable background updates when not charging", | ||||
|     "autoSelectHighestVersionCode": "Auto-select highest versionCode APK", | ||||
|     "versionExtractionRegEx": "Version String Extraction RegEx", | ||||
|   | ||||
| @@ -255,7 +255,7 @@ | ||||
|     "intermediateLinkNotFound": "Enlace intermedio no encontrado", | ||||
|     "intermediateLink": "Enlace intermedio", | ||||
|     "exemptFromBackgroundUpdates": "Exenta de actualizciones en segundo plano (si están habilitadas)", | ||||
|     "bgUpdatesOnWiFiOnly": "Deshabilitar las actualizaciones en segundo plano sin WiFi", | ||||
|     "bgUpdatesOnWiFiOnly": "Deshabilitar las actualizaciones en segundo plano sinWi-Fi", | ||||
|     "bgUpdatesWhileChargingOnly": "Desactiva las actualizaciones en segundo plano cuando no estés cargando", | ||||
|     "autoSelectHighestVersionCode": "Auto selección del paquete APK con versión más reciente", | ||||
|     "versionExtractionRegEx": "Versión de extracción RegEx", | ||||
|   | ||||
| @@ -255,7 +255,7 @@ | ||||
|     "intermediateLinkNotFound": "لینک میانی پیدا نشد", | ||||
|     "intermediateLink": "پیوند میانی", | ||||
|     "exemptFromBackgroundUpdates": "معاف از بهروزرسانیهای پسزمینه (در صورت فعال بودن)", | ||||
|     "bgUpdatesOnWiFiOnly": "بهروزرسانیهای پسزمینه را در صورت عدم اتصال به WiFi غیرفعال کنید", | ||||
|     "bgUpdatesOnWiFiOnly": "بهروزرسانیهای پسزمینه را در صورت عدم اتصال بهWi-Fi غیرفعال کنید", | ||||
|     "bgUpdatesWhileChargingOnly": "بهروزرسانیهای پسزمینه را هنگام شارژ نشدن غیرفعال کنید", | ||||
|     "autoSelectHighestVersionCode": "انتخاب خودکار بالاترین نسخه کد APK", | ||||
|     "versionExtractionRegEx": "نسخه استخراج RegEx", | ||||
|   | ||||
| @@ -255,7 +255,7 @@ | ||||
|     "intermediateLinkNotFound": "Lien intermédiaire introuvable", | ||||
|     "intermediateLink": "Lien intermédiaire", | ||||
|     "exemptFromBackgroundUpdates": "Exclure de la mise à jour en arrière-plan (si activé)", | ||||
|     "bgUpdatesOnWiFiOnly": "Désactiver les mises à jour en arrière-plan lorsque vous n'êtes pas en WiFi", | ||||
|     "bgUpdatesOnWiFiOnly": "Désactiver les mises à jour en arrière-plan lorsque vous n'êtes pas enWi-Fi", | ||||
|     "bgUpdatesWhileChargingOnly": "Désactiver les mises à jour en arrière-plan lorsque le véhicule n'est pas en charge", | ||||
|     "autoSelectHighestVersionCode": "Sélectionner automatiquement la version la plus récente du code APK", | ||||
|     "versionExtractionRegEx": "Extraire la version par Expression régulière", | ||||
|   | ||||
| @@ -255,7 +255,7 @@ | ||||
|     "intermediateLinkNotFound": "Tautan perantara tidak ditemukan", | ||||
|     "intermediateLink": "Tautan perantara", | ||||
|     "exemptFromBackgroundUpdates": "Dikecualikan dari pembaruan latar belakang (jika diaktifkan)", | ||||
|     "bgUpdatesOnWiFiOnly": "Nonaktifkan pembaruan latar belakang saat tidak menggunakan WiFi", | ||||
|     "bgUpdatesOnWiFiOnly": "Nonaktifkan pembaruan latar belakang saat tidak menggunakanWi-Fi", | ||||
|     "bgUpdatesWhileChargingOnly": "Menonaktifkan pembaruan latar belakang saat tidak mengisi daya", | ||||
|     "autoSelectHighestVersionCode": "Pilih otomatis APK dengan versi kode tertinggi", | ||||
|     "versionExtractionRegEx": "Reguler ekspresi terkait ekstraksi versi string", | ||||
|   | ||||
| @@ -255,7 +255,7 @@ | ||||
|     "intermediateLinkNotFound": "Link intermedio non trovato", | ||||
|     "intermediateLink": "Collegamento intermedio", | ||||
|     "exemptFromBackgroundUpdates": "Esente da aggiornamenti in secondo piano (se attivo)", | ||||
|     "bgUpdatesOnWiFiOnly": "Disattiva aggiornamenti in secondo piano quando non si usa il WiFi", | ||||
|     "bgUpdatesOnWiFiOnly": "Disattiva aggiornamenti in secondo piano quando non si usa ilWi-Fi", | ||||
|     "bgUpdatesWhileChargingOnly": "Disabilita gli aggiornamenti in background quando non è in carica", | ||||
|     "autoSelectHighestVersionCode": "Auto-seleziona APK con versionCode più alto", | ||||
|     "versionExtractionRegEx": "RegEx di estrazione versione", | ||||
|   | ||||
| @@ -255,7 +255,7 @@ | ||||
|     "intermediateLinkNotFound": "Intermediaire link niet gevonden", | ||||
|     "intermediateLink": "Intermediaire link", | ||||
|     "exemptFromBackgroundUpdates": "Vrijgesteld van achtergrond-updates (indien ingeschakeld)", | ||||
|     "bgUpdatesOnWiFiOnly": "Achtergrond-updates uitschakelen wanneer niet verbonden met WiFi", | ||||
|     "bgUpdatesOnWiFiOnly": "Achtergrond-updates uitschakelen wanneer niet verbonden metWi-Fi", | ||||
|     "bgUpdatesWhileChargingOnly": "Achtergrondupdates uitschakelen als er niet wordt opgeladen", | ||||
|     "autoSelectHighestVersionCode": "De APK met de hoogste versiecode automatisch selecteren", | ||||
|     "versionExtractionRegEx": "Reguliere expressie voor versie-extractie", | ||||
|   | ||||
| @@ -255,7 +255,7 @@ | ||||
|     "intermediateLinkNotFound": "Mellanlänk hittades inte", | ||||
|     "intermediateLink": "Mellanlänk", | ||||
|     "exemptFromBackgroundUpdates": "Undta från bakgrundsuppdateringar (om aktiverad)", | ||||
|     "bgUpdatesOnWiFiOnly": "Inaktivera Bakgrundsuppdateringar utan WiFi", | ||||
|     "bgUpdatesOnWiFiOnly": "Inaktivera Bakgrundsuppdateringar utanWi-Fi", | ||||
|     "bgUpdatesWhileChargingOnly": "Inaktivera bakgrundsuppdateringar när du inte laddar", | ||||
|     "autoSelectHighestVersionCode": "Välj automatiskt högsta versionskod APK", | ||||
|     "versionExtractionRegEx": "Version Extraction RegEx", | ||||
|   | ||||
| @@ -255,7 +255,7 @@ | ||||
|     "intermediateLinkNotFound": "Không tìm thấy liên kết trung gian", | ||||
|     "intermediateLink": "Liên kết trung gian", | ||||
|     "exemptFromBackgroundUpdates": "Miễn cập nhật nền (nếu được bật)", | ||||
|     "bgUpdatesOnWiFiOnly": "Tắt cập nhật nền khi không có WiFi", | ||||
|     "bgUpdatesOnWiFiOnly": "Tắt cập nhật nền khi không cóWi-Fi", | ||||
|     "bgUpdatesWhileChargingOnly": "Disable background updates when not charging", | ||||
|     "autoSelectHighestVersionCode": "Tự động chọn APK mã phiên bản cao nhất", | ||||
|     "versionExtractionRegEx": "Trích xuất phiên bản RegEx", | ||||
|   | ||||
| @@ -255,7 +255,7 @@ | ||||
|     "intermediateLinkNotFound": "沒有找到中間連結", | ||||
|     "intermediateLink": "中間連結", | ||||
|     "exemptFromBackgroundUpdates": "免除背景更新(若已啟用)", | ||||
|     "bgUpdatesOnWiFiOnly": "停用非 WiFi 的背景更新", | ||||
|     "bgUpdatesOnWiFiOnly": "停用非Wi-Fi 的背景更新", | ||||
|     "bgUpdatesWhileChargingOnly": "Disable background updates when not charging", | ||||
|     "autoSelectHighestVersionCode": "自動選擇最高 versionCode 的 APK", | ||||
|     "versionExtractionRegEx": "版本字串提取正則表達式", | ||||
|   | ||||
| @@ -13,7 +13,6 @@ | ||||
| 			<li>F-Droid</li> | ||||
| 			<li>Third Party F-Droid Repos</li> | ||||
| 			<li>IzzyOnDroid</li> | ||||
| 			<li>SourceForge</li> | ||||
| 			<li>SourceHut</li> | ||||
| 		</ul> | ||||
| 	</li> | ||||
| @@ -22,24 +21,17 @@ | ||||
| 		<ul> | ||||
| 			<li>APKPure</li> | ||||
| 			<li>Aptoide</li> | ||||
| 			<li>Uptodowng</li> | ||||
| 			<li>Uptodown</li> | ||||
| 			<li>APKMirror (Track-Only)</li> | ||||
| 			<li>Huawei AppGallery</li> | ||||
| 			<li>Tencent App Store</li> | ||||
| 			<li>Jenkins Jobs</li> | ||||
| 		</ul> | ||||
| 	</li> | ||||
| 	<li> | ||||
| 		<p>Open Source - App-Specific:</p> | ||||
| 		<ul> | ||||
| 			<li>Mullvad</li> | ||||
| 			<li>Signal</li> | ||||
| 			<li>VLC</li> | ||||
| 			<li>RuStore</li> | ||||
| 		</ul> | ||||
| 	</li> | ||||
| 	<li> | ||||
| 		<p>Other - App-Specific:</p> | ||||
| 		<ul> | ||||
| 			<li>WhatsApp</li> | ||||
| 			<li>Telegram App</li> | ||||
| 			<li>Neutron Code</li> | ||||
| 		</ul> | ||||
|   | ||||
| @@ -13,7 +13,6 @@ | ||||
| 			<li>F-Droid</li> | ||||
| 			<li>Third Party F-Droid Repos</li> | ||||
| 			<li>IzzyOnDroid</li> | ||||
| 			<li>SourceForge</li> | ||||
| 			<li>SourceHut</li> | ||||
| 		</ul> | ||||
| 	</li> | ||||
| @@ -22,24 +21,17 @@ | ||||
| 		<ul> | ||||
| 			<li>APKPure</li> | ||||
| 			<li>Aptoide</li> | ||||
| 			<li>Uptodowng</li> | ||||
| 			<li>Uptodown</li> | ||||
| 			<li>APKMirror (Track-Only)</li> | ||||
| 			<li>Huawei AppGallery</li> | ||||
| 			<li>Tencent App Store</li> | ||||
| 			<li>Jenkins Jobs</li> | ||||
| 		</ul> | ||||
| 	</li> | ||||
| 	<li> | ||||
| 		<p>Свободное ПО - Для отдельных приложений:</p> | ||||
| 		<ul> | ||||
| 			<li>Mullvad</li> | ||||
| 			<li>Signal</li> | ||||
| 			<li>VLC</li> | ||||
| 			<li>RuStore</li> | ||||
| 		</ul> | ||||
| 	</li> | ||||
| 	<li> | ||||
| 		<p>Другие - Для отдельных приложений:</p> | ||||
| 		<ul> | ||||
| 			<li>WhatsApp</li> | ||||
| 			<li>Telegram App</li> | ||||
| 			<li>Neutron Code</li> | ||||
| 		</ul> | ||||
|   | ||||
| @@ -53,8 +53,12 @@ class GitLab extends AppSource { | ||||
|  | ||||
|   @override | ||||
|   String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) { | ||||
|     var urlSegments = url.split('/'); | ||||
|     var cutOffIndex = urlSegments.indexWhere((s) => s == '-'); | ||||
|     url = | ||||
|         urlSegments.sublist(0, cutOffIndex <= 0 ? null : cutOffIndex).join('/'); | ||||
|     RegExp standardUrlRegEx = RegExp( | ||||
|         '^https?://(www\\.)?${getSourceRegex(hosts)}/[^/]+(/[^/]+){1,20}', | ||||
|         '^https?://(www\\.)?${getSourceRegex(hosts)}/[^/]+(/[^/-]+){1,20}', | ||||
|         caseSensitive: false); | ||||
|     RegExpMatch? match = standardUrlRegEx.firstMatch(url); | ||||
|     if (match == null) { | ||||
| @@ -159,12 +163,18 @@ class GitLab extends AppSource { | ||||
|     apkDetailsList = json.map((e) { | ||||
|       var apkUrlsFromAssets = (e['assets']?['links'] as List<dynamic>? ?? []) | ||||
|           .map((e) { | ||||
|             return (e['direct_asset_url'] ?? e['url'] ?? '') as String; | ||||
|             var url = (e['direct_asset_url'] ?? e['url'] ?? '') as String; | ||||
|             var parsedUrl = url.isNotEmpty ? Uri.parse(url) : null; | ||||
|             return MapEntry( | ||||
|                 (e['name'] ?? | ||||
|                     (parsedUrl != null && parsedUrl.pathSegments.isNotEmpty | ||||
|                         ? parsedUrl.pathSegments.last | ||||
|                         : 'unknown')) as String, | ||||
|                 (e['direct_asset_url'] ?? e['url'] ?? '') as String); | ||||
|           }) | ||||
|           .where((s) => s.isNotEmpty) | ||||
|           .where((s) => s.key.isNotEmpty) | ||||
|           .toList(); | ||||
|       List<String> uploadedAPKsFromDescription = | ||||
|           ((e['description'] ?? '') as String) | ||||
|       var uploadedAPKsFromDescription = ((e['description'] ?? '') as String) | ||||
|           .split('](') | ||||
|           .join('\n') | ||||
|           .split('.apk)') | ||||
| @@ -172,16 +182,20 @@ class GitLab extends AppSource { | ||||
|           .split('\n') | ||||
|           .where((s) => s.startsWith('/uploads/') && s.endsWith('apk')) | ||||
|           .map((s) => 'https://${hosts[0]}/-/project/$projectId$s') | ||||
|           .map((l) => MapEntry(Uri.parse(l).pathSegments.last, l)) | ||||
|           .toList(); | ||||
|       var apkUrlsSet = apkUrlsFromAssets.toSet(); | ||||
|       apkUrlsSet.addAll(uploadedAPKsFromDescription); | ||||
|       Map<String, String> apkUrls = {}; | ||||
|       for (var entry in apkUrlsFromAssets) { | ||||
|         apkUrls[entry.key] = entry.value; | ||||
|       } | ||||
|       for (var entry in uploadedAPKsFromDescription) { | ||||
|         apkUrls[entry.key] = entry.value; | ||||
|       } | ||||
|       var releaseDateString = | ||||
|           e['released_at'] ?? e['created_at'] ?? e['commit']?['created_at']; | ||||
|       DateTime? releaseDate = | ||||
|           releaseDateString != null ? DateTime.parse(releaseDateString) : null; | ||||
|       return APKDetails( | ||||
|           e['tag_name'] ?? e['name'], | ||||
|           getApkUrlsFromUrls(apkUrlsSet.toList()), | ||||
|       return APKDetails(e['tag_name'] ?? e['name'], apkUrls.entries.toList(), | ||||
|           AppNames(names.author, names.name.split('/').last), | ||||
|           releaseDate: releaseDate); | ||||
|     }); | ||||
|   | ||||
| @@ -358,10 +358,12 @@ class HTML extends AppSource { | ||||
|             .toString(); | ||||
|     return APKDetails( | ||||
|         version, | ||||
|         [rel] | ||||
|             .map((e) => | ||||
|                 MapEntry('${e.hashCode}-${Uri.parse(e).pathSegments.last}', e)) | ||||
|             .toList(), | ||||
|         [rel].map((e) { | ||||
|           var uri = Uri.parse(e); | ||||
|           var fileName = | ||||
|               uri.pathSegments.isNotEmpty ? uri.pathSegments.last : uri.origin; | ||||
|           return MapEntry('${e.hashCode}-$fileName', e); | ||||
|         }).toList(), | ||||
|         AppNames(uri.host, tr('app'))); | ||||
|   } | ||||
| } | ||||
|   | ||||
							
								
								
									
										98
									
								
								lib/app_sources/rustore.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										98
									
								
								lib/app_sources/rustore.dart
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,98 @@ | ||||
| import 'dart:convert'; | ||||
| import 'dart:typed_data'; | ||||
|  | ||||
| import 'package:easy_localization/easy_localization.dart'; | ||||
| import 'package:flutter_charset_detector/flutter_charset_detector.dart'; | ||||
| import 'package:http/http.dart'; | ||||
| import 'package:obtainium/custom_errors.dart'; | ||||
| import 'package:obtainium/providers/source_provider.dart'; | ||||
|  | ||||
| class RuStore extends AppSource { | ||||
|   RuStore() { | ||||
|     hosts = ['rustore.ru']; | ||||
|     name = 'RuStore'; | ||||
|     naiveStandardVersionDetection = true; | ||||
|     showReleaseDateAsVersionToggle = true; | ||||
|   } | ||||
|  | ||||
|   @override | ||||
|   String sourceSpecificStandardizeURL(String url, {bool forSelection = false}) { | ||||
|     RegExp standardUrlRegEx = RegExp( | ||||
|         '^https?://(www\\.)?${getSourceRegex(hosts)}/catalog/app/+[^/]+', | ||||
|         caseSensitive: false); | ||||
|     RegExpMatch? match = standardUrlRegEx.firstMatch(url); | ||||
|     if (match == null) { | ||||
|       throw InvalidURLError(name); | ||||
|     } | ||||
|     return match.group(0)!; | ||||
|   } | ||||
|  | ||||
|   @override | ||||
|   Future<String?> tryInferringAppId(String standardUrl, | ||||
|       {Map<String, dynamic> additionalSettings = const {}}) async { | ||||
|     return Uri.parse(standardUrl).pathSegments.last; | ||||
|   } | ||||
|  | ||||
|   @override | ||||
|   Future<APKDetails> getLatestAPKDetails( | ||||
|     String standardUrl, | ||||
|     Map<String, dynamic> additionalSettings, | ||||
|   ) async { | ||||
|     String? appId = await tryInferringAppId(standardUrl); | ||||
|     Response res0 = await sourceRequest( | ||||
|         'https://backapi.rustore.ru/applicationData/overallInfo/$appId', | ||||
|         additionalSettings); | ||||
|     if (res0.statusCode != 200) { | ||||
|       throw getObtainiumHttpError(res0); | ||||
|     } | ||||
|     var appDetails = jsonDecode(res0.body)['body']; | ||||
|     if (appDetails['appId'] == null) { | ||||
|       throw NoReleasesError(); | ||||
|     } | ||||
|  | ||||
|     String appName = appDetails['appName'] ?? tr('app'); | ||||
|     String author = appDetails['companyName'] ?? name; | ||||
|     String? dateStr = appDetails['updatedAt']; | ||||
|     String? version = appDetails['versionName']; | ||||
|     String? changeLog = appDetails['whatsNew']; | ||||
|     if (version == null) { | ||||
|       throw NoVersionError(); | ||||
|     } | ||||
|     DateTime? relDate; | ||||
|     if (dateStr != null) { | ||||
|       relDate = DateTime.parse(dateStr); | ||||
|     } | ||||
|  | ||||
|     Response res1 = await sourceRequest( | ||||
|         'https://backapi.rustore.ru/applicationData/download-link', | ||||
|         additionalSettings, | ||||
|         followRedirects: false, | ||||
|         postBody: {"appId": appDetails['appId'], "firstInstall": true}); | ||||
|     var downloadDetails = jsonDecode(res1.body)['body']; | ||||
|     if (res1.statusCode != 200 || downloadDetails['apkUrl'] == null) { | ||||
|       throw NoAPKError(); | ||||
|     } | ||||
|  | ||||
|     appName = (await CharsetDetector.autoDecode( | ||||
|             Uint8List.fromList(appName.codeUnits))) | ||||
|         .string; | ||||
|     author = | ||||
|         (await CharsetDetector.autoDecode(Uint8List.fromList(author.codeUnits))) | ||||
|             .string; | ||||
|     changeLog = changeLog != null | ||||
|         ? (await CharsetDetector.autoDecode( | ||||
|                 Uint8List.fromList(changeLog.codeUnits))) | ||||
|             .string | ||||
|         : null; | ||||
|  | ||||
|     return APKDetails( | ||||
|         version, | ||||
|         getApkUrlsFromUrls([ | ||||
|           (downloadDetails['apkUrl'] as String) | ||||
|               .replaceAll(RegExp('\\.zip\$'), '.apk') | ||||
|         ]), | ||||
|         AppNames(author, appName), | ||||
|         releaseDate: relDate, | ||||
|         changeLog: changeLog); | ||||
|   } | ||||
| } | ||||
| @@ -64,11 +64,11 @@ class Tencent extends AppSource { | ||||
|       var author = json['app_detail_records'][appId]['app_info']['author']; | ||||
|       var releaseDate = | ||||
|           json['app_detail_records'][appId]['app_info']['update_time']; | ||||
|       var apkName = Uri.parse(apkUrl).queryParameters['fsname'] ?? | ||||
|           '${appId}_${version}.apk'; | ||||
|  | ||||
|       return APKDetails( | ||||
|           version, | ||||
|           [MapEntry(Uri.parse(apkUrl).queryParameters['fsname']!, apkUrl)], | ||||
|           AppNames(author, appName), | ||||
|           version, [MapEntry(apkName, apkUrl)], AppNames(author, appName), | ||||
|           releaseDate: releaseDate != null | ||||
|               ? DateTime.fromMillisecondsSinceEpoch(releaseDate * 1000) | ||||
|               : null); | ||||
|   | ||||
| @@ -23,7 +23,7 @@ import 'package:easy_localization/src/localization.dart'; | ||||
| List<MapEntry<Locale, String>> supportedLocales = const [ | ||||
|   MapEntry(Locale('en'), 'English'), | ||||
|   MapEntry(Locale('zh'), '简体中文'), | ||||
|   MapEntry(Locale('zh_Hant_TW'), '臺灣話'), | ||||
|   MapEntry(Locale('zh', 'Hant_TW'), '臺灣話'), | ||||
|   MapEntry(Locale('it'), 'Italiano'), | ||||
|   MapEntry(Locale('ja'), '日本語'), | ||||
|   MapEntry(Locale('hu'), 'Magyar'), | ||||
| @@ -61,11 +61,11 @@ Future<void> loadTranslations() async { | ||||
|   var forceLocale = s.forcedLocale; | ||||
|   final controller = EasyLocalizationController( | ||||
|     saveLocale: true, | ||||
|     forceLocale: forceLocale != null ? Locale(forceLocale) : null, | ||||
|     forceLocale: forceLocale, | ||||
|     fallbackLocale: fallbackLocale, | ||||
|     supportedLocales: supportedLocales.map((e) => e.key).toList(), | ||||
|     assetLoader: const RootBundleAssetLoader(), | ||||
|     useOnlyLangCode: true, | ||||
|     useOnlyLangCode: false, | ||||
|     useFallbackTranslations: true, | ||||
|     path: localeDir, | ||||
|     onLoadError: (FlutterError e) { | ||||
| @@ -119,7 +119,7 @@ void main() async { | ||||
|         supportedLocales: supportedLocales.map((e) => e.key).toList(), | ||||
|         path: localeDir, | ||||
|         fallbackLocale: fallbackLocale, | ||||
|         useOnlyLangCode: true, | ||||
|         useOnlyLangCode: false, | ||||
|         child: const Obtainium()), | ||||
|   )); | ||||
|   BackgroundFetch.registerHeadlessTask(backgroundFetchHeadlessTask); | ||||
| @@ -203,12 +203,9 @@ class _ObtainiumState extends State<Obtainium> { | ||||
|           }); | ||||
|         } | ||||
|       } | ||||
|       if (!supportedLocales | ||||
|               .map((e) => e.key.languageCode) | ||||
|               .contains(context.locale.languageCode) || | ||||
|       if (!supportedLocales.map((e) => e.key).contains(context.locale) || | ||||
|           (settingsProvider.forcedLocale == null && | ||||
|               context.deviceLocale.languageCode != | ||||
|                   context.locale.languageCode)) { | ||||
|               context.deviceLocale != context.locale)) { | ||||
|         settingsProvider.resetLocaleSafe(context); | ||||
|       } | ||||
|     } | ||||
| @@ -251,17 +248,15 @@ class _ObtainiumState extends State<Obtainium> { | ||||
|               colorScheme: settingsProvider.theme == ThemeSettings.dark | ||||
|                   ? darkColorScheme | ||||
|                   : lightColorScheme, | ||||
|               fontFamily: settingsProvider.useSystemFont | ||||
|                   ? 'SystemFont' | ||||
|                   : 'Wix-Madefor-Display'), | ||||
|               fontFamily: | ||||
|                   settingsProvider.useSystemFont ? 'SystemFont' : 'Montserrat'), | ||||
|           darkTheme: ThemeData( | ||||
|               useMaterial3: true, | ||||
|               colorScheme: settingsProvider.theme == ThemeSettings.light | ||||
|                   ? lightColorScheme | ||||
|                   : darkColorScheme, | ||||
|               fontFamily: settingsProvider.useSystemFont | ||||
|                   ? 'SystemFont' | ||||
|                   : 'Wix-Madefor-Display'), | ||||
|               fontFamily: | ||||
|                   settingsProvider.useSystemFont ? 'SystemFont' : 'Montserrat'), | ||||
|           home: Shortcuts(shortcuts: <LogicalKeySet, Intent>{ | ||||
|             LogicalKeySet(LogicalKeyboardKey.select): const ActivateIntent(), | ||||
|           }, child: const HomePage())); | ||||
|   | ||||
| @@ -1,6 +1,7 @@ | ||||
| import 'package:easy_localization/easy_localization.dart'; | ||||
| import 'package:flutter/material.dart'; | ||||
| import 'package:flutter/services.dart'; | ||||
| import 'package:flutter_markdown/flutter_markdown.dart'; | ||||
| import 'package:obtainium/components/generated_form_modal.dart'; | ||||
| import 'package:obtainium/custom_errors.dart'; | ||||
| import 'package:obtainium/main.dart'; | ||||
| @@ -12,6 +13,7 @@ import 'package:obtainium/providers/source_provider.dart'; | ||||
| import 'package:url_launcher/url_launcher_string.dart'; | ||||
| import 'package:webview_flutter/webview_flutter.dart'; | ||||
| import 'package:provider/provider.dart'; | ||||
| import 'package:markdown/markdown.dart' as md; | ||||
|  | ||||
| class AppPage extends StatefulWidget { | ||||
|   const AppPage({super.key, required this.appId}); | ||||
| @@ -221,6 +223,7 @@ class _AppPageState extends State<AppPage> { | ||||
|           if (app?.app.additionalSettings['about'] is String && | ||||
|               app?.app.additionalSettings['about'].isNotEmpty) | ||||
|             Column( | ||||
|               mainAxisSize: MainAxisSize.min, | ||||
|               children: [ | ||||
|                 const SizedBox( | ||||
|                   height: 48, | ||||
| @@ -233,12 +236,28 @@ class _AppPageState extends State<AppPage> { | ||||
|                         content: Text(tr('copiedToClipboard')), | ||||
|                       )); | ||||
|                     }, | ||||
|                   child: Text( | ||||
|                     app?.app.additionalSettings['about'], | ||||
|                     textAlign: TextAlign.center, | ||||
|                     style: const TextStyle(fontStyle: FontStyle.italic), | ||||
|                     child: Markdown( | ||||
|                       physics: NeverScrollableScrollPhysics(), | ||||
|                       shrinkWrap: true, | ||||
|                       styleSheet: MarkdownStyleSheet( | ||||
|                           blockquoteDecoration: | ||||
|                               BoxDecoration(color: Theme.of(context).cardColor), | ||||
|                           textAlign: WrapAlignment.center), | ||||
|                       data: app?.app.additionalSettings['about'], | ||||
|                       onTapLink: (text, href, title) { | ||||
|                         if (href != null) { | ||||
|                           launchUrlString(href, | ||||
|                               mode: LaunchMode.externalApplication); | ||||
|                         } | ||||
|                       }, | ||||
|                       extensionSet: md.ExtensionSet( | ||||
|                         md.ExtensionSet.gitHubFlavored.blockSyntaxes, | ||||
|                         [ | ||||
|                           md.EmojiSyntax(), | ||||
|                           ...md.ExtensionSet.gitHubFlavored.inlineSyntaxes | ||||
|                         ], | ||||
|                       ), | ||||
|                 ) | ||||
|                     )) | ||||
|               ], | ||||
|             ), | ||||
|         ], | ||||
|   | ||||
| @@ -262,14 +262,14 @@ class _SettingsPageState extends State<SettingsPage> { | ||||
|             child: Text(tr('followSystem')), | ||||
|           ), | ||||
|           ...supportedLocales.map((e) => DropdownMenuItem( | ||||
|                 value: e.key.toLanguageTag(), | ||||
|                 value: e.key, | ||||
|                 child: Text(e.value), | ||||
|               )) | ||||
|         ], | ||||
|         onChanged: (value) { | ||||
|           settingsProvider.forcedLocale = value; | ||||
|           if (value != null) { | ||||
|             context.setLocale(Locale(value)); | ||||
|             context.setLocale(value); | ||||
|           } else { | ||||
|             settingsProvider.resetLocaleSafe(context); | ||||
|           } | ||||
|   | ||||
| @@ -261,22 +261,24 @@ class SettingsProvider with ChangeNotifier { | ||||
|     notifyListeners(); | ||||
|   } | ||||
|  | ||||
|   String? get forcedLocale { | ||||
|     var fl = prefs?.getString('forcedLocale'); | ||||
|     return supportedLocales | ||||
|             .where((element) => element.key.toLanguageTag() == fl) | ||||
|             .isNotEmpty | ||||
|   Locale? get forcedLocale { | ||||
|     var flSegs = prefs?.getString('forcedLocale')?.split('-'); | ||||
|     var fl = flSegs != null && flSegs.isNotEmpty | ||||
|         ? Locale(flSegs[0], flSegs.length > 1 ? flSegs[1] : null) | ||||
|         : null; | ||||
|     var set = supportedLocales.where((element) => element.key == fl).isNotEmpty | ||||
|         ? fl | ||||
|         : null; | ||||
|     return set; | ||||
|   } | ||||
|  | ||||
|   set forcedLocale(String? fl) { | ||||
|   set forcedLocale(Locale? fl) { | ||||
|     if (fl == null) { | ||||
|       prefs?.remove('forcedLocale'); | ||||
|     } else if (supportedLocales | ||||
|         .where((element) => element.key.toLanguageTag() == fl) | ||||
|         .where((element) => element.key == fl) | ||||
|         .isNotEmpty) { | ||||
|       prefs?.setString('forcedLocale', fl); | ||||
|       prefs?.setString('forcedLocale', fl.toLanguageTag()); | ||||
|     } | ||||
|     notifyListeners(); | ||||
|   } | ||||
| @@ -285,9 +287,7 @@ class SettingsProvider with ChangeNotifier { | ||||
|       a.length == b.length && a.union(b).length == a.length; | ||||
|  | ||||
|   void resetLocaleSafe(BuildContext context) { | ||||
|     if (context.supportedLocales | ||||
|         .map((e) => e.languageCode) | ||||
|         .contains(context.deviceLocale.languageCode)) { | ||||
|     if (context.supportedLocales.contains(context.deviceLocale)) { | ||||
|       context.resetLocale(); | ||||
|     } else { | ||||
|       context.setLocale(context.fallbackLocale!); | ||||
|   | ||||
| @@ -23,6 +23,7 @@ import 'package:obtainium/app_sources/izzyondroid.dart'; | ||||
| import 'package:obtainium/app_sources/html.dart'; | ||||
| import 'package:obtainium/app_sources/jenkins.dart'; | ||||
| import 'package:obtainium/app_sources/neutroncode.dart'; | ||||
| import 'package:obtainium/app_sources/rustore.dart'; | ||||
| import 'package:obtainium/app_sources/sourceforge.dart'; | ||||
| import 'package:obtainium/app_sources/sourcehut.dart'; | ||||
| import 'package:obtainium/app_sources/telegramapp.dart'; | ||||
| @@ -864,6 +865,7 @@ class SourceProvider { | ||||
|         Tencent(), | ||||
|         Jenkins(), | ||||
|         APKMirror(), | ||||
|         RuStore(), | ||||
|         TelegramApp(), | ||||
|         NeutronCode(), | ||||
|         DirectAPKLink(), | ||||
|   | ||||
							
								
								
									
										218
									
								
								pubspec.lock
									
									
									
									
									
								
							
							
						
						
									
										218
									
								
								pubspec.lock
									
									
									
									
									
								
							| @@ -5,10 +5,10 @@ packages: | ||||
|     dependency: "direct main" | ||||
|     description: | ||||
|       name: android_intent_plus | ||||
|       sha256: "884b01361fe3756c4abbb56a382a00b16a2519079794a585afa7019a73cc0add" | ||||
|       sha256: dfc1fd3a577205ae8f11e990fb4ece8c90cceabbee56fcf48e463ecf0bd6aae3 | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "5.2.2" | ||||
|     version: "5.3.0" | ||||
|   android_package_installer: | ||||
|     dependency: "direct main" | ||||
|     description: | ||||
| @@ -48,10 +48,10 @@ packages: | ||||
|     dependency: "direct main" | ||||
|     description: | ||||
|       name: app_links | ||||
|       sha256: "433df2e61b10519407475d7f69e470789d23d593f28224c38ba1068597be7950" | ||||
|       sha256: "85ed8fc1d25a76475914fff28cc994653bd900bc2c26e4b57a49e097febb54ba" | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "6.3.3" | ||||
|     version: "6.4.0" | ||||
|   app_links_linux: | ||||
|     dependency: transitive | ||||
|     description: | ||||
| @@ -96,10 +96,10 @@ packages: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: async | ||||
|       sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" | ||||
|       sha256: d2872f9c19731c2e5f10444b14686eb7cc85c76274bd6c16e1816bff9a3bab63 | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "2.11.0" | ||||
|     version: "2.12.0" | ||||
|   background_fetch: | ||||
|     dependency: "direct main" | ||||
|     description: | ||||
| @@ -128,18 +128,18 @@ packages: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: boolean_selector | ||||
|       sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" | ||||
|       sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "2.1.1" | ||||
|     version: "2.1.2" | ||||
|   characters: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: characters | ||||
|       sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" | ||||
|       sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "1.3.0" | ||||
|     version: "1.4.0" | ||||
|   checked_yaml: | ||||
|     dependency: transitive | ||||
|     description: | ||||
| @@ -160,26 +160,26 @@ packages: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: clock | ||||
|       sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf | ||||
|       sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "1.1.1" | ||||
|     version: "1.1.2" | ||||
|   collection: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: collection | ||||
|       sha256: a1ace0a119f20aabc852d165077c036cd864315bd99b7eaa10a60100341941bf | ||||
|       sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "1.19.0" | ||||
|     version: "1.19.1" | ||||
|   connectivity_plus: | ||||
|     dependency: "direct main" | ||||
|     description: | ||||
|       name: connectivity_plus | ||||
|       sha256: "8a68739d3ee113e51ad35583fdf9ab82c55d09d693d3c39da1aebab87c938412" | ||||
|       sha256: "04bf81bb0b77de31557b58d052b24b3eee33f09a6e7a8c68a3e247c7df19ec27" | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "6.1.2" | ||||
|     version: "6.1.3" | ||||
|   connectivity_plus_platform_interface: | ||||
|     dependency: transitive | ||||
|     description: | ||||
| @@ -232,10 +232,10 @@ packages: | ||||
|     dependency: "direct main" | ||||
|     description: | ||||
|       name: device_info_plus | ||||
|       sha256: b37d37c2f912ad4e8ec694187de87d05de2a3cb82b465ff1f65f65a2d05de544 | ||||
|       sha256: "72d146c6d7098689ff5c5f66bcf593ac11efc530095385356e131070333e64da" | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "11.2.1" | ||||
|     version: "11.3.0" | ||||
|   device_info_plus_platform_interface: | ||||
|     dependency: transitive | ||||
|     description: | ||||
| @@ -280,18 +280,18 @@ packages: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: fake_async | ||||
|       sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" | ||||
|       sha256: "6a95e56b2449df2273fd8c45a662d6947ce1ebb7aafe80e550a3f68297f3cacc" | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "1.3.1" | ||||
|     version: "1.3.2" | ||||
|   ffi: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: ffi | ||||
|       sha256: "16ed7b077ef01ad6170a3d0c57caa4a112a38d7a2ed5602e0aca9ca6f3d98da6" | ||||
|       sha256: "289279317b4b16eb2bb7e271abccd4bf84ec9bdcbe999e278a94b804f5630418" | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "2.1.3" | ||||
|     version: "2.1.4" | ||||
|   file: | ||||
|     dependency: transitive | ||||
|     description: | ||||
| @@ -304,10 +304,10 @@ packages: | ||||
|     dependency: "direct main" | ||||
|     description: | ||||
|       name: file_picker | ||||
|       sha256: c904b4ab56d53385563c7c39d8e9fa9af086f91495dfc48717ad84a42c3cf204 | ||||
|       sha256: "6f6bfa8797f296965bdc3e1f702574ab49a540c19b9237b401e7c2b25dfe594c" | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "8.1.7" | ||||
|     version: "9.0.0" | ||||
|   fixnum: | ||||
|     dependency: transitive | ||||
|     description: | ||||
| @@ -345,14 +345,54 @@ packages: | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "6.0.3" | ||||
|   flutter_charset_detector: | ||||
|     dependency: "direct main" | ||||
|     description: | ||||
|       name: flutter_charset_detector | ||||
|       sha256: d7c11a82c2c51cb35a010b42c64001afb8a9e4d7be1f57620604d386d3467ad1 | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "4.0.0" | ||||
|   flutter_charset_detector_android: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: flutter_charset_detector_android | ||||
|       sha256: "443145e8fc8515b3b32aee375691e40dd59197a86a2ae153166bc88c8200d83b" | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "3.0.0" | ||||
|   flutter_charset_detector_darwin: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: flutter_charset_detector_darwin | ||||
|       sha256: daac20390275efb92fbb14350fe11286c5e29c7b80d6b0867f52d760f0d69763 | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "1.1.0" | ||||
|   flutter_charset_detector_platform_interface: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: flutter_charset_detector_platform_interface | ||||
|       sha256: "1c09ed7b314a5a9dde76057b98b7d35458ba881eed03d5e5b6f7f74b4869d18c" | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "1.1.0" | ||||
|   flutter_charset_detector_web: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: flutter_charset_detector_web | ||||
|       sha256: b547194e97e15d2cca17e957ad7f373b48abf35080e645ac5b6976d129b0265d | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "1.2.0" | ||||
|   flutter_fgbg: | ||||
|     dependency: "direct main" | ||||
|     description: | ||||
|       name: flutter_fgbg | ||||
|       sha256: e02ad0738ba5fc7f331b62acb0d74aa540626a6441ae18fad685faa5ac4ad7a5 | ||||
|       sha256: eb6da9b2047372566a6e17b505975fe5bace94af01f6fc825c4b6f81baa6c447 | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "0.6.0" | ||||
|     version: "0.7.1" | ||||
|   flutter_keyboard_visibility: | ||||
|     dependency: transitive | ||||
|     description: | ||||
| @@ -450,10 +490,10 @@ packages: | ||||
|     dependency: "direct main" | ||||
|     description: | ||||
|       name: flutter_markdown | ||||
|       sha256: e37f4c69a07b07bb92622ef6b131a53c9aae48f64b176340af9e8e5238718487 | ||||
|       sha256: e7bbc718adc9476aa14cfddc1ef048d2e21e4e8f18311aaac723266db9f9e7b5 | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "0.7.5" | ||||
|     version: "0.7.6+2" | ||||
|   flutter_plugin_android_lifecycle: | ||||
|     dependency: transitive | ||||
|     description: | ||||
| @@ -484,10 +524,10 @@ packages: | ||||
|     dependency: "direct main" | ||||
|     description: | ||||
|       name: fluttertoast | ||||
|       sha256: "24467dc20bbe49fd63e57d8e190798c4d22cbbdac30e54209d153a15273721d1" | ||||
|       sha256: "25e51620424d92d3db3832464774a6143b5053f15e382d8ffbfd40b6e795dcf1" | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "8.2.10" | ||||
|     version: "8.2.12" | ||||
|   fraction: | ||||
|     dependency: transitive | ||||
|     description: | ||||
| @@ -552,6 +592,14 @@ packages: | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "0.19.0" | ||||
|   js: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: js | ||||
|       sha256: "53385261521cc4a0c4658fd0ad07a7d14591cf8fc33abbceae306ddb974888dc" | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "0.7.2" | ||||
|   json_annotation: | ||||
|     dependency: transitive | ||||
|     description: | ||||
| @@ -564,18 +612,18 @@ packages: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: leak_tracker | ||||
|       sha256: "7bb2830ebd849694d1ec25bf1f44582d6ac531a57a365a803a6034ff751d2d06" | ||||
|       sha256: c35baad643ba394b40aac41080300150a4f08fd0fd6a10378f8f7c6bc161acec | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "10.0.7" | ||||
|     version: "10.0.8" | ||||
|   leak_tracker_flutter_testing: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: leak_tracker_flutter_testing | ||||
|       sha256: "9491a714cca3667b60b5c420da8217e6de0d1ba7a5ec322fab01758f6998f379" | ||||
|       sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573 | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "3.0.8" | ||||
|     version: "3.0.9" | ||||
|   leak_tracker_testing: | ||||
|     dependency: transitive | ||||
|     description: | ||||
| @@ -604,10 +652,10 @@ packages: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: matcher | ||||
|       sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb | ||||
|       sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "0.12.16+1" | ||||
|     version: "0.12.17" | ||||
|   material_color_utilities: | ||||
|     dependency: transitive | ||||
|     description: | ||||
| @@ -620,10 +668,10 @@ packages: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: meta | ||||
|       sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 | ||||
|       sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "1.15.0" | ||||
|     version: "1.16.0" | ||||
|   mime: | ||||
|     dependency: transitive | ||||
|     description: | ||||
| @@ -652,10 +700,10 @@ packages: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: path | ||||
|       sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" | ||||
|       sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "1.9.0" | ||||
|     version: "1.9.1" | ||||
|   path_provider: | ||||
|     dependency: "direct main" | ||||
|     description: | ||||
| @@ -708,26 +756,26 @@ packages: | ||||
|     dependency: "direct main" | ||||
|     description: | ||||
|       name: permission_handler | ||||
|       sha256: "18bf33f7fefbd812f37e72091a15575e72d5318854877e0e4035a24ac1113ecb" | ||||
|       sha256: "59adad729136f01ea9e35a48f5d1395e25cba6cea552249ddbe9cf950f5d7849" | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "11.3.1" | ||||
|     version: "11.4.0" | ||||
|   permission_handler_android: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: permission_handler_android | ||||
|       sha256: "71bbecfee799e65aff7c744761a57e817e73b738fedf62ab7afd5593da21f9f1" | ||||
|       sha256: d3971dcdd76182a0c198c096b5db2f0884b0d4196723d21a866fc4cdea057ebc | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "12.0.13" | ||||
|     version: "12.1.0" | ||||
|   permission_handler_apple: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: permission_handler_apple | ||||
|       sha256: e6f6d73b12438ef13e648c4ae56bd106ec60d17e90a59c4545db6781229082a0 | ||||
|       sha256: f84a188e79a35c687c132a0a0556c254747a08561e99ab933f12f6ca71ef3c98 | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "9.4.5" | ||||
|     version: "9.4.6" | ||||
|   permission_handler_html: | ||||
|     dependency: transitive | ||||
|     description: | ||||
| @@ -740,10 +788,10 @@ packages: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: permission_handler_platform_interface | ||||
|       sha256: e9c8eadee926c4532d0305dff94b85bf961f16759c3af791486613152af4b4f9 | ||||
|       sha256: eb99b295153abce5d683cac8c02e22faab63e50679b937fa1bf67d58bb282878 | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "4.2.3" | ||||
|     version: "4.3.0" | ||||
|   permission_handler_windows: | ||||
|     dependency: transitive | ||||
|     description: | ||||
| @@ -844,18 +892,18 @@ packages: | ||||
|     dependency: "direct main" | ||||
|     description: | ||||
|       name: shared_preferences | ||||
|       sha256: c59819dacc6669a1165d54d2735a9543f136f9b3cec94ca65cea6ab8dffc422e | ||||
|       sha256: "846849e3e9b68f3ef4b60c60cf4b3e02e9321bc7f4d8c4692cf87ffa82fc8a3a" | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "2.4.0" | ||||
|     version: "2.5.2" | ||||
|   shared_preferences_android: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: shared_preferences_android | ||||
|       sha256: "650584dcc0a39856f369782874e562efd002a9c94aec032412c9eb81419cce1f" | ||||
|       sha256: a768fc8ede5f0c8e6150476e14f38e2417c0864ca36bb4582be8e21925a03c22 | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "2.4.4" | ||||
|     version: "2.4.6" | ||||
|   shared_preferences_foundation: | ||||
|     dependency: transitive | ||||
|     description: | ||||
| @@ -884,10 +932,10 @@ packages: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: shared_preferences_web | ||||
|       sha256: d2ca4132d3946fec2184261726b355836a82c33d7d5b67af32692aff18a4684e | ||||
|       sha256: c49bd060261c9a3f0ff445892695d6212ff603ef3115edbb448509d407600019 | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "2.4.2" | ||||
|     version: "2.4.3" | ||||
|   shared_preferences_windows: | ||||
|     dependency: transitive | ||||
|     description: | ||||
| @@ -923,10 +971,10 @@ packages: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: source_span | ||||
|       sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" | ||||
|       sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c" | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "1.10.0" | ||||
|     version: "1.10.1" | ||||
|   sprintf: | ||||
|     dependency: transitive | ||||
|     description: | ||||
| @@ -939,34 +987,34 @@ packages: | ||||
|     dependency: "direct main" | ||||
|     description: | ||||
|       name: sqflite | ||||
|       sha256: "2d7299468485dca85efeeadf5d38986909c5eb0cd71fd3db2c2f000e6c9454bb" | ||||
|       sha256: e2297b1da52f127bc7a3da11439985d9b536f75070f3325e62ada69a5c585d03 | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "2.4.1" | ||||
|     version: "2.4.2" | ||||
|   sqflite_android: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: sqflite_android | ||||
|       sha256: "78f489aab276260cdd26676d2169446c7ecd3484bbd5fead4ca14f3ed4dd9ee3" | ||||
|       sha256: "2b3070c5fa881839f8b402ee4a39c1b4d561704d4ebbbcfb808a119bc2a1701b" | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "2.4.0" | ||||
|     version: "2.4.1" | ||||
|   sqflite_common: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: sqflite_common | ||||
|       sha256: "761b9740ecbd4d3e66b8916d784e581861fd3c3553eda85e167bc49fdb68f709" | ||||
|       sha256: "84731e8bfd8303a3389903e01fb2141b6e59b5973cacbb0929021df08dddbe8b" | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "2.5.4+6" | ||||
|     version: "2.5.5" | ||||
|   sqflite_darwin: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: sqflite_darwin | ||||
|       sha256: "22adfd9a2c7d634041e96d6241e6e1c8138ca6817018afc5d443fef91dcefa9c" | ||||
|       sha256: "279832e5cde3fe99e8571879498c9211f3ca6391b0d818df4e17d9fff5c6ccb3" | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "2.4.1+1" | ||||
|     version: "2.4.2" | ||||
|   sqflite_platform_interface: | ||||
|     dependency: transitive | ||||
|     description: | ||||
| @@ -979,50 +1027,50 @@ packages: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: stack_trace | ||||
|       sha256: "9f47fd3630d76be3ab26f0ee06d213679aa425996925ff3feffdec504931c377" | ||||
|       sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "1.12.0" | ||||
|     version: "1.12.1" | ||||
|   stream_channel: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: stream_channel | ||||
|       sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 | ||||
|       sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "2.1.2" | ||||
|     version: "2.1.4" | ||||
|   string_scanner: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: string_scanner | ||||
|       sha256: "688af5ed3402a4bde5b3a6c15fd768dbf2621a614950b17f04626c431ab3c4c3" | ||||
|       sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "1.3.0" | ||||
|     version: "1.4.1" | ||||
|   synchronized: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: synchronized | ||||
|       sha256: "69fe30f3a8b04a0be0c15ae6490fc859a78ef4c43ae2dd5e8a623d45bfcf9225" | ||||
|       sha256: "0669c70faae6270521ee4f05bffd2919892d42d1276e6c495be80174b6bc0ef6" | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "3.3.0+3" | ||||
|     version: "3.3.1" | ||||
|   term_glyph: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: term_glyph | ||||
|       sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 | ||||
|       sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "1.2.1" | ||||
|     version: "1.2.2" | ||||
|   test_api: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: test_api | ||||
|       sha256: "664d3a9a64782fcdeb83ce9c6b39e78fd2971d4e37827b9b06c3aa1edc5e760c" | ||||
|       sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "0.7.3" | ||||
|     version: "0.7.4" | ||||
|   timezone: | ||||
|     dependency: transitive | ||||
|     description: | ||||
| @@ -1131,10 +1179,10 @@ packages: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: vm_service | ||||
|       sha256: f6be3ed8bd01289b34d679c2b62226f63c0e69f9fd2e50a6b3c1c729a961041b | ||||
|       sha256: "0968250880a6c5fe7edc067ed0a13d4bae1577fe2771dcf3010d52c4a9d3ca14" | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "14.3.0" | ||||
|     version: "14.3.1" | ||||
|   web: | ||||
|     dependency: transitive | ||||
|     description: | ||||
| @@ -1155,10 +1203,10 @@ packages: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: webview_flutter_android | ||||
|       sha256: "5568f17a9c25c0fdd0737900fa1c2d1fee2d780bc212d9aec10c2d1f48ef0f59" | ||||
|       sha256: "512c26ccc5b8a571fd5d13ec994b7509f142ff6faf85835e243dde3538fdc713" | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "4.3.1" | ||||
|     version: "4.3.2" | ||||
|   webview_flutter_platform_interface: | ||||
|     dependency: transitive | ||||
|     description: | ||||
| @@ -1171,18 +1219,18 @@ packages: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: webview_flutter_wkwebview | ||||
|       sha256: "8e0593559bfecd35eb1757d6907ed6b995a41ef82607d6113df897c2805ce6be" | ||||
|       sha256: d7403ef4f042714c9ee2b26eaac4cadae7394cb0d4e608b1dd850c3ff96bd893 | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "3.18.0" | ||||
|     version: "3.18.2" | ||||
|   win32: | ||||
|     dependency: transitive | ||||
|     description: | ||||
|       name: win32 | ||||
|       sha256: daf97c9d80197ed7b619040e86c8ab9a9dad285e7671ee7390f9180cc828a51e | ||||
|       sha256: b89e6e24d1454e149ab20fbb225af58660f0c0bf4475544650700d8e2da54aef | ||||
|       url: "https://pub.dev" | ||||
|     source: hosted | ||||
|     version: "5.10.1" | ||||
|     version: "5.11.0" | ||||
|   win32_registry: | ||||
|     dependency: transitive | ||||
|     description: | ||||
| @@ -1216,5 +1264,5 @@ packages: | ||||
|     source: hosted | ||||
|     version: "3.1.3" | ||||
| sdks: | ||||
|   dart: ">=3.6.0 <4.0.0" | ||||
|   dart: ">=3.7.0 <4.0.0" | ||||
|   flutter: ">=3.27.0" | ||||
|   | ||||
							
								
								
									
										11
									
								
								pubspec.yaml
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								pubspec.yaml
									
									
									
									
									
								
							| @@ -16,7 +16,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev | ||||
| # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html | ||||
| # In Windows, build-name is used as the major, minor, and patch parts | ||||
| # of the product and file versions while build-number is used as the build suffix. | ||||
| version: 1.1.40+2297 | ||||
| version: 1.1.43+2300 | ||||
|  | ||||
| environment: | ||||
|   sdk: ^3.6.0 | ||||
| @@ -35,7 +35,7 @@ dependencies: | ||||
|   # Use with the CupertinoIcons class for iOS style icons. | ||||
|   cupertino_icons: ^1.0.5 | ||||
|   path_provider: ^2.0.11 | ||||
|   flutter_fgbg: ^0.6.0 | ||||
|   flutter_fgbg: ^0.7.1 | ||||
|   flutter_local_notifications: ^18.0.0 | ||||
|   provider: ^6.0.3 | ||||
|   http: ^1.0.0 | ||||
| @@ -47,7 +47,7 @@ dependencies: | ||||
|   permission_handler: ^11.0.0 | ||||
|   fluttertoast: ^8.0.9 | ||||
|   device_info_plus: ^11.0.0 | ||||
|   file_picker: ^8.0.0+1 | ||||
|   file_picker: ^9.0.0 | ||||
|   animations: ^2.0.4 | ||||
|   android_package_installer: # TODO: See if PR will be accepted (dev may not be active), else remove this comment | ||||
|     git: | ||||
| @@ -86,6 +86,7 @@ dependencies: | ||||
|   markdown: any | ||||
|   flutter_typeahead: ^5.2.0 | ||||
|   battery_plus: ^6.1.0 | ||||
|   flutter_charset_detector: ^4.0.0 | ||||
| dev_dependencies: | ||||
|   flutter_test: | ||||
|     sdk: flutter | ||||
| @@ -150,6 +151,6 @@ flutter: | ||||
|   # see https://flutter.dev/to/font-from-package | ||||
|  | ||||
|   fonts: | ||||
|       - family: Wix-Madefor-Display | ||||
|       - family: Montserrat | ||||
|         fonts: | ||||
|           - asset: assets/fonts/WixMadeforDisplay-Regular.otf | ||||
|           - asset: assets/fonts/Montserrat-Regular.ttf | ||||
		Reference in New Issue
	
	Block a user