mirror of
				https://github.com/ImranR98/Obtainium.git
				synced 2025-10-31 05:23:28 +01:00 
			
		
		
		
	Merge pull request #823 from ImranR98/dev
Various Enhancements and Bugfixes
This commit is contained in:
		| @@ -240,13 +240,15 @@ | |||||||
|    "gitlabSourceNote": "GitLab APK extraction may not work without an API key.", |    "gitlabSourceNote": "GitLab APK extraction may not work without an API key.", | ||||||
|    "sortByFileNamesNotLinks": "Sort by file names instead of full links", |    "sortByFileNamesNotLinks": "Sort by file names instead of full links", | ||||||
|    "filterReleaseNotesByRegEx": "Filter Release Notes by Regular Expression", |    "filterReleaseNotesByRegEx": "Filter Release Notes by Regular Expression", | ||||||
|    "customLinkFilterRegex": "Custom Link Filter by Regular Expression (Default '.apk$')", |    "customLinkFilterRegex": "Custom APK Link Filter by Regular Expression (Default '.apk$')", | ||||||
|    "appsPossiblyUpdated": "App Updates Attempted", |    "appsPossiblyUpdated": "App Updates Attempted", | ||||||
|    "appsPossiblyUpdatedNotifDescription": "Notifies the user that updates to one or more Apps were potentially applied in the background", |    "appsPossiblyUpdatedNotifDescription": "Notifies the user that updates to one or more Apps were potentially applied in the background", | ||||||
|    "xWasPossiblyUpdatedToY": "{} may have been updated to {}.", |    "xWasPossiblyUpdatedToY": "{} may have been updated to {}.", | ||||||
|    "backgroundUpdateReqsExplanation": "Background updates may not be possible for all apps.", |    "backgroundUpdateReqsExplanation": "Background updates may not be possible for all apps.", | ||||||
|    "backgroundUpdateLimitsExplanation": "The success of a background install can only be determined when Obtainium is opened.", |    "backgroundUpdateLimitsExplanation": "The success of a background install can only be determined when Obtainium is opened.", | ||||||
|    "verifyLatestTag": "Verify the 'latest' tag", |    "verifyLatestTag": "Verify the 'latest' tag", | ||||||
|  |    "exemptFromBackgroundUpdates": "Exempt from background updates (if enabled)", | ||||||
|  |    "bgUpdatesOnWiFiOnly": "Disable background updates when not on WiFi", | ||||||
|    "removeAppQuestion": { |    "removeAppQuestion": { | ||||||
|       "one": "Želite li ukloniti aplikaciju?", |       "one": "Želite li ukloniti aplikaciju?", | ||||||
|       "other": "Želite li ukloniti aplikacije?" |       "other": "Želite li ukloniti aplikacije?" | ||||||
|   | |||||||
| @@ -247,6 +247,8 @@ | |||||||
|     "backgroundUpdateReqsExplanation": "Background updates may not be possible for all apps.", |     "backgroundUpdateReqsExplanation": "Background updates may not be possible for all apps.", | ||||||
|     "backgroundUpdateLimitsExplanation": "The success of a background install can only be determined when Obtainium is opened.", |     "backgroundUpdateLimitsExplanation": "The success of a background install can only be determined when Obtainium is opened.", | ||||||
|     "verifyLatestTag": "Verify the 'latest' tag", |     "verifyLatestTag": "Verify the 'latest' tag", | ||||||
|  |     "exemptFromBackgroundUpdates": "Exempt from background updates (if enabled)", | ||||||
|  |     "bgUpdatesOnWiFiOnly": "Disable background updates when not on WiFi", | ||||||
|     "removeAppQuestion": { |     "removeAppQuestion": { | ||||||
|         "one": "App entfernen?", |         "one": "App entfernen?", | ||||||
|         "other": "Apps entfernen?" |         "other": "Apps entfernen?" | ||||||
|   | |||||||
| @@ -240,7 +240,7 @@ | |||||||
|     "gitlabSourceNote": "GitLab APK extraction may not work without an API key.", |     "gitlabSourceNote": "GitLab APK extraction may not work without an API key.", | ||||||
|     "sortByFileNamesNotLinks": "Sort by file names instead of full links", |     "sortByFileNamesNotLinks": "Sort by file names instead of full links", | ||||||
|     "filterReleaseNotesByRegEx": "Filter Release Notes by Regular Expression", |     "filterReleaseNotesByRegEx": "Filter Release Notes by Regular Expression", | ||||||
|     "customLinkFilterRegex": "Custom Link Filter by Regular Expression (Default '.apk$')", |     "customLinkFilterRegex": "Custom APK Link Filter by Regular Expression (Default '.apk$')", | ||||||
|     "appsPossiblyUpdated": "App Updates Attempted", |     "appsPossiblyUpdated": "App Updates Attempted", | ||||||
|     "appsPossiblyUpdatedNotifDescription": "Notifies the user that updates to one or more Apps were potentially applied in the background", |     "appsPossiblyUpdatedNotifDescription": "Notifies the user that updates to one or more Apps were potentially applied in the background", | ||||||
|     "xWasPossiblyUpdatedToY": "{} may have been updated to {}.", |     "xWasPossiblyUpdatedToY": "{} may have been updated to {}.", | ||||||
| @@ -248,6 +248,10 @@ | |||||||
|     "backgroundUpdateReqsExplanation": "Background updates may not be possible for all apps.", |     "backgroundUpdateReqsExplanation": "Background updates may not be possible for all apps.", | ||||||
|     "backgroundUpdateLimitsExplanation": "The success of a background install can only be determined when Obtainium is opened.", |     "backgroundUpdateLimitsExplanation": "The success of a background install can only be determined when Obtainium is opened.", | ||||||
|     "verifyLatestTag": "Verify the 'latest' tag", |     "verifyLatestTag": "Verify the 'latest' tag", | ||||||
|  |     "intermediateLinkRegex": "Filter for an 'Intermediate' Link to Visit First", | ||||||
|  |     "intermediateLinkNotFound": "Intermediate link not found", | ||||||
|  |     "exemptFromBackgroundUpdates": "Exempt from background updates (if enabled)", | ||||||
|  |     "bgUpdatesOnWiFiOnly": "Disable background updates when not on WiFi", | ||||||
|     "removeAppQuestion": { |     "removeAppQuestion": { | ||||||
|         "one": "Remove App?", |         "one": "Remove App?", | ||||||
|         "other": "Remove Apps?" |         "other": "Remove Apps?" | ||||||
|   | |||||||
| @@ -240,13 +240,15 @@ | |||||||
|     "gitlabSourceNote": "GitLab APK extraction may not work without an API key.", |     "gitlabSourceNote": "GitLab APK extraction may not work without an API key.", | ||||||
|     "sortByFileNamesNotLinks": "Sort by file names instead of full links", |     "sortByFileNamesNotLinks": "Sort by file names instead of full links", | ||||||
|     "filterReleaseNotesByRegEx": "Filter Release Notes by Regular Expression", |     "filterReleaseNotesByRegEx": "Filter Release Notes by Regular Expression", | ||||||
|     "customLinkFilterRegex": "Custom Link Filter by Regular Expression (Default '.apk$')", |     "customLinkFilterRegex": "Custom APK Link Filter by Regular Expression (Default '.apk$')", | ||||||
|     "appsPossiblyUpdated": "App Updates Attempted", |     "appsPossiblyUpdated": "App Updates Attempted", | ||||||
|     "appsPossiblyUpdatedNotifDescription": "Notifies the user that updates to one or more Apps were potentially applied in the background", |     "appsPossiblyUpdatedNotifDescription": "Notifies the user that updates to one or more Apps were potentially applied in the background", | ||||||
|     "xWasPossiblyUpdatedToY": "{} may have been updated to {}.", |     "xWasPossiblyUpdatedToY": "{} may have been updated to {}.", | ||||||
|     "backgroundUpdateReqsExplanation": "Background updates may not be possible for all apps.", |     "backgroundUpdateReqsExplanation": "Background updates may not be possible for all apps.", | ||||||
|     "backgroundUpdateLimitsExplanation": "The success of a background install can only be determined when Obtainium is opened.", |     "backgroundUpdateLimitsExplanation": "The success of a background install can only be determined when Obtainium is opened.", | ||||||
|     "verifyLatestTag": "Verify the 'latest' tag", |     "verifyLatestTag": "Verify the 'latest' tag", | ||||||
|  |     "exemptFromBackgroundUpdates": "Exempt from background updates (if enabled)", | ||||||
|  |     "bgUpdatesOnWiFiOnly": "Disable background updates when not on WiFi", | ||||||
|     "removeAppQuestion": { |     "removeAppQuestion": { | ||||||
|         "one": "¿Eliminar Aplicación?", |         "one": "¿Eliminar Aplicación?", | ||||||
|         "other": "¿Eliminar Aplicaciones?" |         "other": "¿Eliminar Aplicaciones?" | ||||||
|   | |||||||
| @@ -247,6 +247,8 @@ | |||||||
|     "backgroundUpdateReqsExplanation": "Background updates may not be possible for all apps.", |     "backgroundUpdateReqsExplanation": "Background updates may not be possible for all apps.", | ||||||
|     "backgroundUpdateLimitsExplanation": "The success of a background install can only be determined when Obtainium is opened.", |     "backgroundUpdateLimitsExplanation": "The success of a background install can only be determined when Obtainium is opened.", | ||||||
|     "verifyLatestTag": "Verify the 'latest' tag", |     "verifyLatestTag": "Verify the 'latest' tag", | ||||||
|  |     "exemptFromBackgroundUpdates": "Exempt from background updates (if enabled)", | ||||||
|  |     "bgUpdatesOnWiFiOnly": "Disable background updates when not on WiFi", | ||||||
|     "removeAppQuestion": { |     "removeAppQuestion": { | ||||||
|         "one": "برنامه حذف شود؟", |         "one": "برنامه حذف شود؟", | ||||||
|         "other": "برنامه ها حذف شوند؟" |         "other": "برنامه ها حذف شوند؟" | ||||||
|   | |||||||
| @@ -240,13 +240,15 @@ | |||||||
|     "gitlabSourceNote": "GitLab APK extraction may not work without an API key.", |     "gitlabSourceNote": "GitLab APK extraction may not work without an API key.", | ||||||
|     "sortByFileNamesNotLinks": "Sort by file names instead of full links", |     "sortByFileNamesNotLinks": "Sort by file names instead of full links", | ||||||
|     "filterReleaseNotesByRegEx": "Filter Release Notes by Regular Expression", |     "filterReleaseNotesByRegEx": "Filter Release Notes by Regular Expression", | ||||||
|     "customLinkFilterRegex": "Custom Link Filter by Regular Expression (Default '.apk$')", |     "customLinkFilterRegex": "Custom APK Link Filter by Regular Expression (Default '.apk$')", | ||||||
|     "appsPossiblyUpdated": "App Updates Attempted", |     "appsPossiblyUpdated": "App Updates Attempted", | ||||||
|     "appsPossiblyUpdatedNotifDescription": "Notifies the user that updates to one or more Apps were potentially applied in the background", |     "appsPossiblyUpdatedNotifDescription": "Notifies the user that updates to one or more Apps were potentially applied in the background", | ||||||
|     "xWasPossiblyUpdatedToY": "{} may have been updated to {}.", |     "xWasPossiblyUpdatedToY": "{} may have been updated to {}.", | ||||||
|     "backgroundUpdateReqsExplanation": "Background updates may not be possible for all apps.", |     "backgroundUpdateReqsExplanation": "Background updates may not be possible for all apps.", | ||||||
|     "backgroundUpdateLimitsExplanation": "The success of a background install can only be determined when Obtainium is opened.", |     "backgroundUpdateLimitsExplanation": "The success of a background install can only be determined when Obtainium is opened.", | ||||||
|     "verifyLatestTag": "Verify the 'latest' tag", |     "verifyLatestTag": "Verify the 'latest' tag", | ||||||
|  |     "exemptFromBackgroundUpdates": "Exempt from background updates (if enabled)", | ||||||
|  |     "bgUpdatesOnWiFiOnly": "Disable background updates when not on WiFi", | ||||||
|     "removeAppQuestion": { |     "removeAppQuestion": { | ||||||
|         "one": "Supprimer l'application ?", |         "one": "Supprimer l'application ?", | ||||||
|         "other": "Supprimer les applications ?" |         "other": "Supprimer les applications ?" | ||||||
|   | |||||||
| @@ -239,13 +239,15 @@ | |||||||
|     "gitlabSourceNote": "Előfordulhat, hogy a GitLab APK kibontása nem működik API-kulcs nélkül.", |     "gitlabSourceNote": "Előfordulhat, hogy a GitLab APK kibontása nem működik API-kulcs nélkül.", | ||||||
|     "sortByFileNamesNotLinks": "Fájlnevek szerinti elrendezés teljes linkek helyett", |     "sortByFileNamesNotLinks": "Fájlnevek szerinti elrendezés teljes linkek helyett", | ||||||
|     "filterReleaseNotesByRegEx": "Kiadási megjegyzések szűrése reguláris kifejezéssel", |     "filterReleaseNotesByRegEx": "Kiadási megjegyzések szűrése reguláris kifejezéssel", | ||||||
|     "customLinkFilterRegex": "Custom Link Filter by Regular Expression (Default '.apk$')", |     "customLinkFilterRegex": "Custom APK Link Filter by Regular Expression (Default '.apk$')", | ||||||
|     "appsPossiblyUpdated": "App Updates Attempted", |     "appsPossiblyUpdated": "App Updates Attempted", | ||||||
|     "appsPossiblyUpdatedNotifDescription": "Notifies the user that updates to one or more Apps were potentially applied in the background", |     "appsPossiblyUpdatedNotifDescription": "Notifies the user that updates to one or more Apps were potentially applied in the background", | ||||||
|     "xWasPossiblyUpdatedToY": "{} may have been updated to {}.", |     "xWasPossiblyUpdatedToY": "{} may have been updated to {}.", | ||||||
|     "backgroundUpdateReqsExplanation": "Background updates may not be possible for all apps.", |     "backgroundUpdateReqsExplanation": "Background updates may not be possible for all apps.", | ||||||
|     "backgroundUpdateLimitsExplanation": "The success of a background install can only be determined when Obtainium is opened.", |     "backgroundUpdateLimitsExplanation": "The success of a background install can only be determined when Obtainium is opened.", | ||||||
|     "verifyLatestTag": "Verify the 'latest' tag", |     "verifyLatestTag": "Verify the 'latest' tag", | ||||||
|  |     "exemptFromBackgroundUpdates": "Exempt from background updates (if enabled)", | ||||||
|  |     "bgUpdatesOnWiFiOnly": "Disable background updates when not on WiFi", | ||||||
|     "removeAppQuestion": { |     "removeAppQuestion": { | ||||||
|         "one": "Eltávolítja az alkalmazást?", |         "one": "Eltávolítja az alkalmazást?", | ||||||
|         "other": "Eltávolítja az alkalmazást?" |         "other": "Eltávolítja az alkalmazást?" | ||||||
|   | |||||||
| @@ -240,13 +240,15 @@ | |||||||
|     "gitlabSourceNote": "GitLab APK extraction may not work without an API key.", |     "gitlabSourceNote": "GitLab APK extraction may not work without an API key.", | ||||||
|     "sortByFileNamesNotLinks": "Sort by file names instead of full links", |     "sortByFileNamesNotLinks": "Sort by file names instead of full links", | ||||||
|     "filterReleaseNotesByRegEx": "Filter Release Notes by Regular Expression", |     "filterReleaseNotesByRegEx": "Filter Release Notes by Regular Expression", | ||||||
|     "customLinkFilterRegex": "Custom Link Filter by Regular Expression (Default '.apk$')", |     "customLinkFilterRegex": "Custom APK Link Filter by Regular Expression (Default '.apk$')", | ||||||
|     "appsPossiblyUpdated": "App Updates Attempted", |     "appsPossiblyUpdated": "App Updates Attempted", | ||||||
|     "appsPossiblyUpdatedNotifDescription": "Notifies the user that updates to one or more Apps were potentially applied in the background", |     "appsPossiblyUpdatedNotifDescription": "Notifies the user that updates to one or more Apps were potentially applied in the background", | ||||||
|     "xWasPossiblyUpdatedToY": "{} may have been updated to {}.", |     "xWasPossiblyUpdatedToY": "{} may have been updated to {}.", | ||||||
|     "backgroundUpdateReqsExplanation": "Background updates may not be possible for all apps.", |     "backgroundUpdateReqsExplanation": "Background updates may not be possible for all apps.", | ||||||
|     "backgroundUpdateLimitsExplanation": "The success of a background install can only be determined when Obtainium is opened.", |     "backgroundUpdateLimitsExplanation": "The success of a background install can only be determined when Obtainium is opened.", | ||||||
|     "verifyLatestTag": "Verify the 'latest' tag", |     "verifyLatestTag": "Verify the 'latest' tag", | ||||||
|  |     "exemptFromBackgroundUpdates": "Exempt from background updates (if enabled)", | ||||||
|  |     "bgUpdatesOnWiFiOnly": "Disable background updates when not on WiFi", | ||||||
|     "removeAppQuestion": { |     "removeAppQuestion": { | ||||||
|         "one": "Rimuovere l'app?", |         "one": "Rimuovere l'app?", | ||||||
|         "other": "Rimuovere le app?" |         "other": "Rimuovere le app?" | ||||||
|   | |||||||
| @@ -248,6 +248,8 @@ | |||||||
|     "backgroundUpdateReqsExplanation": "バックグラウンドアップデートは、すべてのアプリで可能とは限りません。", |     "backgroundUpdateReqsExplanation": "バックグラウンドアップデートは、すべてのアプリで可能とは限りません。", | ||||||
|     "backgroundUpdateLimitsExplanation": "バックグラウンドアップデートが成功したかどうかは、Obtainiumを起動したときにしか判断できません。", |     "backgroundUpdateLimitsExplanation": "バックグラウンドアップデートが成功したかどうかは、Obtainiumを起動したときにしか判断できません。", | ||||||
|     "verifyLatestTag": "'latest'タグを確認する", |     "verifyLatestTag": "'latest'タグを確認する", | ||||||
|  |     "exemptFromBackgroundUpdates": "Exempt from background updates (if enabled)", | ||||||
|  |     "bgUpdatesOnWiFiOnly": "Disable background updates when not on WiFi", | ||||||
|     "removeAppQuestion": { |     "removeAppQuestion": { | ||||||
|         "one": "アプリを削除しますか?", |         "one": "アプリを削除しますか?", | ||||||
|         "other": "アプリを削除しますか?" |         "other": "アプリを削除しますか?" | ||||||
|   | |||||||
| @@ -253,6 +253,8 @@ | |||||||
|     "backgroundUpdateReqsExplanation": "Aktualizacje w tle mogą nie być możliwe dla wszystkich aplikacji.", |     "backgroundUpdateReqsExplanation": "Aktualizacje w tle mogą nie być możliwe dla wszystkich aplikacji.", | ||||||
|     "backgroundUpdateLimitsExplanation": "Powodzenie instalacji w tle można określić dopiero po otwarciu Obtainium.", |     "backgroundUpdateLimitsExplanation": "Powodzenie instalacji w tle można określić dopiero po otwarciu Obtainium.", | ||||||
|     "verifyLatestTag": "Zweryfikuj najnowszy tag", |     "verifyLatestTag": "Zweryfikuj najnowszy tag", | ||||||
|  |     "exemptFromBackgroundUpdates": "Exempt from background updates (if enabled)", | ||||||
|  |     "bgUpdatesOnWiFiOnly": "Disable background updates when not on WiFi", | ||||||
|     "removeAppQuestion": { |     "removeAppQuestion": { | ||||||
|         "one": "Usunąć aplikację?", |         "one": "Usunąć aplikację?", | ||||||
|         "few": "Usunąć aplikacje?", |         "few": "Usunąć aplikacje?", | ||||||
|   | |||||||
| @@ -240,13 +240,15 @@ | |||||||
|     "gitlabSourceNote": "Извлечение APK из GitLab может не работать без ключа API.", |     "gitlabSourceNote": "Извлечение APK из GitLab может не работать без ключа API.", | ||||||
|     "sortByFileNamesNotLinks": "Sort by file names instead of full links", |     "sortByFileNamesNotLinks": "Sort by file names instead of full links", | ||||||
|     "filterReleaseNotesByRegEx": "Filter Release Notes by Regular Expression", |     "filterReleaseNotesByRegEx": "Filter Release Notes by Regular Expression", | ||||||
|     "customLinkFilterRegex": "Custom Link Filter by Regular Expression (Default '.apk$')", |     "customLinkFilterRegex": "Custom APK Link Filter by Regular Expression (Default '.apk$')", | ||||||
|     "appsPossiblyUpdated": "App Updates Attempted", |     "appsPossiblyUpdated": "App Updates Attempted", | ||||||
|     "appsPossiblyUpdatedNotifDescription": "Notifies the user that updates to one or more Apps were potentially applied in the background", |     "appsPossiblyUpdatedNotifDescription": "Notifies the user that updates to one or more Apps were potentially applied in the background", | ||||||
|     "xWasPossiblyUpdatedToY": "{} may have been updated to {}.", |     "xWasPossiblyUpdatedToY": "{} may have been updated to {}.", | ||||||
|     "backgroundUpdateReqsExplanation": "Background updates may not be possible for all apps.", |     "backgroundUpdateReqsExplanation": "Background updates may not be possible for all apps.", | ||||||
|     "backgroundUpdateLimitsExplanation": "The success of a background install can only be determined when Obtainium is opened.", |     "backgroundUpdateLimitsExplanation": "The success of a background install can only be determined when Obtainium is opened.", | ||||||
|     "verifyLatestTag": "Verify the 'latest' tag", |     "verifyLatestTag": "Verify the 'latest' tag", | ||||||
|  |     "exemptFromBackgroundUpdates": "Exempt from background updates (if enabled)", | ||||||
|  |     "bgUpdatesOnWiFiOnly": "Disable background updates when not on WiFi", | ||||||
|     "removeAppQuestion": { |     "removeAppQuestion": { | ||||||
|         "one": "Удалить приложение?", |         "one": "Удалить приложение?", | ||||||
|         "other": "Удалить приложения?" |         "other": "Удалить приложения?" | ||||||
|   | |||||||
| @@ -248,6 +248,8 @@ | |||||||
|     "backgroundUpdateReqsExplanation": "后台更新未必适用于所有的应用。", |     "backgroundUpdateReqsExplanation": "后台更新未必适用于所有的应用。", | ||||||
|     "backgroundUpdateLimitsExplanation": "只有在启动 Obtainium 时才能确认安装是否成功。", |     "backgroundUpdateLimitsExplanation": "只有在启动 Obtainium 时才能确认安装是否成功。", | ||||||
|     "verifyLatestTag": "验证“Latest”标签", |     "verifyLatestTag": "验证“Latest”标签", | ||||||
|  |     "exemptFromBackgroundUpdates": "Exempt from background updates (if enabled)", | ||||||
|  |     "bgUpdatesOnWiFiOnly": "Disable background updates when not on WiFi", | ||||||
|     "removeAppQuestion": { |     "removeAppQuestion": { | ||||||
|         "one": "是否删除应用?", |         "one": "是否删除应用?", | ||||||
|         "other": "是否删除应用?" |         "other": "是否删除应用?" | ||||||
|   | |||||||
| @@ -103,7 +103,16 @@ class HTML extends AppSource { | |||||||
|               } |               } | ||||||
|             ]) |             ]) | ||||||
|       ], |       ], | ||||||
|  |       [ | ||||||
|  |         GeneratedFormTextField('intermediateLinkRegex', | ||||||
|  |             label: tr('intermediateLinkRegex'), | ||||||
|  |             hint: '([0-9]+\.)*[0-9]+/\$', | ||||||
|  |             required: false, | ||||||
|  |             additionalValidators: [(value) => regExValidator(value)]) | ||||||
|  |       ] | ||||||
|     ]; |     ]; | ||||||
|  |     overrideVersionDetectionFormDefault('noVersionDetection', | ||||||
|  |         disableStandard: true, disableRelDate: true); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   @override |   @override | ||||||
| @@ -132,6 +141,21 @@ class HTML extends AppSource { | |||||||
|           .map((element) => element.attributes['href'] ?? '') |           .map((element) => element.attributes['href'] ?? '') | ||||||
|           .toList(); |           .toList(); | ||||||
|       List<String> links = []; |       List<String> links = []; | ||||||
|  |       if ((additionalSettings['intermediateLinkRegex'] as String?) | ||||||
|  |               ?.isNotEmpty == | ||||||
|  |           true) { | ||||||
|  |         var reg = RegExp(additionalSettings['intermediateLinkRegex']); | ||||||
|  |         links = allLinks.where((element) => reg.hasMatch(element)).toList(); | ||||||
|  |         links.sort((a, b) => compareAlphaNumeric(a, b)); | ||||||
|  |         if (links.isEmpty) { | ||||||
|  |           throw ObtainiumError(tr('intermediateLinkNotFound')); | ||||||
|  |         } | ||||||
|  |         Map<String, dynamic> additionalSettingsTemp = | ||||||
|  |             Map.from(additionalSettings); | ||||||
|  |         additionalSettingsTemp['intermediateLinkRegex'] = null; | ||||||
|  |         return getLatestAPKDetails( | ||||||
|  |             ensureAbsoluteUrl(links.last, uri), additionalSettingsTemp); | ||||||
|  |       } | ||||||
|       if ((additionalSettings['customLinkFilterRegex'] as String?) |       if ((additionalSettings['customLinkFilterRegex'] as String?) | ||||||
|               ?.isNotEmpty == |               ?.isNotEmpty == | ||||||
|           true) { |           true) { | ||||||
|   | |||||||
| @@ -7,7 +7,8 @@ class HuaweiAppGallery extends AppSource { | |||||||
|   HuaweiAppGallery() { |   HuaweiAppGallery() { | ||||||
|     name = 'Huawei AppGallery'; |     name = 'Huawei AppGallery'; | ||||||
|     host = 'appgallery.huawei.com'; |     host = 'appgallery.huawei.com'; | ||||||
|     overrideVersionDetectionFormDefault('releaseDateAsVersion', true); |     overrideVersionDetectionFormDefault('releaseDateAsVersion', | ||||||
|  |         disableStandard: true); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   @override |   @override | ||||||
|   | |||||||
| @@ -6,7 +6,8 @@ import 'package:obtainium/providers/source_provider.dart'; | |||||||
|  |  | ||||||
| class Jenkins extends AppSource { | class Jenkins extends AppSource { | ||||||
|   Jenkins() { |   Jenkins() { | ||||||
|     overrideVersionDetectionFormDefault('releaseDateAsVersion', true); |     overrideVersionDetectionFormDefault('releaseDateAsVersion', | ||||||
|  |         disableStandard: true); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   String trimJobUrl(String url) { |   String trimJobUrl(String url) { | ||||||
|   | |||||||
| @@ -1,3 +1,4 @@ | |||||||
|  | import 'package:easy_localization/easy_localization.dart'; | ||||||
| import 'package:html/parser.dart'; | import 'package:html/parser.dart'; | ||||||
| import 'package:http/http.dart'; | import 'package:http/http.dart'; | ||||||
| import 'package:obtainium/app_sources/html.dart'; | import 'package:obtainium/app_sources/html.dart'; | ||||||
| @@ -41,27 +42,59 @@ class VLC extends AppSource { | |||||||
|     String standardUrl, |     String standardUrl, | ||||||
|     Map<String, dynamic> additionalSettings, |     Map<String, dynamic> additionalSettings, | ||||||
|   ) async { |   ) async { | ||||||
|     String? version = await getLatestVersion(standardUrl); |     Response res = await get( | ||||||
|     if (version == null) { |         Uri.parse('https://www.videolan.org/vlc/download-android.html')); | ||||||
|       throw NoVersionError(); |  | ||||||
|     } |  | ||||||
|     String? targetUrl = '$dwUrlBase$version/'; |  | ||||||
|     Response res = await sourceRequest(targetUrl); |  | ||||||
|     List<String> apkUrls = []; |  | ||||||
|     if (res.statusCode == 200) { |     if (res.statusCode == 200) { | ||||||
|       apkUrls = parse(res.body) |       var dwUrlBase = 'get.videolan.org/vlc-android'; | ||||||
|  |       var dwLinks = parse(res.body) | ||||||
|           .querySelectorAll('a') |           .querySelectorAll('a') | ||||||
|           .map((e) => e.attributes['href']?.split('/').last) |           .where((element) => | ||||||
|           .where((h) => |               element.attributes['href']?.contains(dwUrlBase) ?? false) | ||||||
|               h != null && h.isNotEmpty && h.toLowerCase().endsWith('.apk')) |  | ||||||
|           .map((e) => targetUrl + e!) |  | ||||||
|           .toList(); |           .toList(); | ||||||
|  |       String? version = dwLinks.isNotEmpty | ||||||
|  |           ? dwLinks.first.attributes['href'] | ||||||
|  |               ?.split('/') | ||||||
|  |               .where((s) => s.isNotEmpty) | ||||||
|  |               .last | ||||||
|  |           : null; | ||||||
|  |       if (version == null) { | ||||||
|  |         throw NoVersionError(); | ||||||
|  |       } | ||||||
|  |  | ||||||
|  |       String? targetUrl = 'https://$dwUrlBase/$version/'; | ||||||
|  |       Response res2 = await get(Uri.parse(targetUrl)); | ||||||
|  |       List<String> apkUrls = []; | ||||||
|  |       if (res2.statusCode == 200) { | ||||||
|  |         apkUrls = parse(res2.body) | ||||||
|  |             .querySelectorAll('a') | ||||||
|  |             .map((e) => e.attributes['href']?.split('/').last) | ||||||
|  |             .where((h) => | ||||||
|  |                 h != null && h.isNotEmpty && h.toLowerCase().endsWith('.apk')) | ||||||
|  |             .map((e) => targetUrl + e!) | ||||||
|  |             .toList(); | ||||||
|  |       } else if (res2.statusCode == 500 && | ||||||
|  |           res2.body.toLowerCase().indexOf('mirror') > 0) { | ||||||
|  |         var html = parse(res2.body); | ||||||
|  |         var err = ''; | ||||||
|  |         html.body?.nodes.forEach((element) { | ||||||
|  |           if (element.text != null) { | ||||||
|  |             err += '${element.text}\n'; | ||||||
|  |           } | ||||||
|  |         }); | ||||||
|  |         err = err.trim(); | ||||||
|  |         if (err.isEmpty) { | ||||||
|  |           err = tr('err'); | ||||||
|  |         } | ||||||
|  |         throw ObtainiumError(err); | ||||||
|  |       } else { | ||||||
|  |         throw getObtainiumHttpError(res2); | ||||||
|  |       } | ||||||
|  |  | ||||||
|  |       return APKDetails( | ||||||
|  |           version, getApkUrlsFromUrls(apkUrls), AppNames('VideoLAN', 'VLC')); | ||||||
|     } else { |     } else { | ||||||
|       throw getObtainiumHttpError(res); |       throw getObtainiumHttpError(res); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     return APKDetails( |  | ||||||
|         version, getApkUrlsFromUrls(apkUrls), AppNames('VideoLAN', 'VLC')); |  | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   @override |   @override | ||||||
|   | |||||||
| @@ -19,7 +19,7 @@ import 'package:easy_localization/src/easy_localization_controller.dart'; | |||||||
| // ignore: implementation_imports | // ignore: implementation_imports | ||||||
| import 'package:easy_localization/src/localization.dart'; | import 'package:easy_localization/src/localization.dart'; | ||||||
|  |  | ||||||
| const String currentVersion = '0.14.1'; | const String currentVersion = '0.14.2'; | ||||||
| const String currentReleaseTag = | const String currentReleaseTag = | ||||||
|     'v$currentVersion-beta'; // KEEP THIS IN SYNC WITH GITHUB RELEASES |     'v$currentVersion-beta'; // KEEP THIS IN SYNC WITH GITHUB RELEASES | ||||||
|  |  | ||||||
|   | |||||||
| @@ -341,10 +341,15 @@ class _AppPageState extends State<AppPage> { | |||||||
|                       app?.app.id != null ? [app!.app.id] : [], |                       app?.app.id != null ? [app!.app.id] : [], | ||||||
|                       globalNavigatorKey.currentContext, |                       globalNavigatorKey.currentContext, | ||||||
|                       settingsProvider); |                       settingsProvider); | ||||||
|  |                   if (app?.app.installedVersion != null && !trackOnly) { | ||||||
|  |                     // ignore: use_build_context_synchronously | ||||||
|  |                     showError(tr('appsUpdated'), context); | ||||||
|  |                   } | ||||||
|                   if (res.isNotEmpty && mounted) { |                   if (res.isNotEmpty && mounted) { | ||||||
|                     Navigator.of(context).pop(); |                     Navigator.of(context).pop(); | ||||||
|                   } |                   } | ||||||
|                 } catch (e) { |                 } catch (e) { | ||||||
|  |                   // ignore: use_build_context_synchronously | ||||||
|                   showError(e, context); |                   showError(e, context); | ||||||
|                 } |                 } | ||||||
|               } |               } | ||||||
|   | |||||||
| @@ -689,6 +689,10 @@ class AppsPageState extends State<AppsPage> { | |||||||
|                       .catchError((e) { |                       .catchError((e) { | ||||||
|                     showError(e, context); |                     showError(e, context); | ||||||
|                     return <String>[]; |                     return <String>[]; | ||||||
|  |                   }).then((value) { | ||||||
|  |                     if (shouldInstallUpdates) { | ||||||
|  |                       showError(tr('appsUpdated'), context); | ||||||
|  |                     } | ||||||
|                   }); |                   }); | ||||||
|                 } |                 } | ||||||
|               }); |               }); | ||||||
|   | |||||||
| @@ -252,7 +252,32 @@ class _SettingsPageState extends State<SettingsPage> { | |||||||
|                                                 style: Theme.of(context) |                                                 style: Theme.of(context) | ||||||
|                                                     .textTheme |                                                     .textTheme | ||||||
|                                                     .labelSmall), |                                                     .labelSmall), | ||||||
|                                             height8 |                                             height8, | ||||||
|  |                                             if (settingsProvider | ||||||
|  |                                                 .enableBackgroundUpdates) | ||||||
|  |                                               Column( | ||||||
|  |                                                 children: [ | ||||||
|  |                                                   height16, | ||||||
|  |                                                   Row( | ||||||
|  |                                                     mainAxisAlignment: | ||||||
|  |                                                         MainAxisAlignment | ||||||
|  |                                                             .spaceBetween, | ||||||
|  |                                                     children: [ | ||||||
|  |                                                       Flexible( | ||||||
|  |                                                           child: Text(tr( | ||||||
|  |                                                               'bgUpdatesOnWiFiOnly'))), | ||||||
|  |                                                       Switch( | ||||||
|  |                                                           value: settingsProvider | ||||||
|  |                                                               .bgUpdatesOnWiFiOnly, | ||||||
|  |                                                           onChanged: (value) { | ||||||
|  |                                                             settingsProvider | ||||||
|  |                                                                     .bgUpdatesOnWiFiOnly = | ||||||
|  |                                                                 value; | ||||||
|  |                                                           }) | ||||||
|  |                                                     ], | ||||||
|  |                                                   ), | ||||||
|  |                                                 ], | ||||||
|  |                                               ), | ||||||
|                                           ], |                                           ], | ||||||
|                                         ) |                                         ) | ||||||
|                                       : const SizedBox.shrink(); |                                       : const SizedBox.shrink(); | ||||||
|   | |||||||
| @@ -9,6 +9,7 @@ import 'package:android_alarm_manager_plus/android_alarm_manager_plus.dart'; | |||||||
| import 'package:android_intent_plus/flag.dart'; | import 'package:android_intent_plus/flag.dart'; | ||||||
| import 'package:android_package_installer/android_package_installer.dart'; | import 'package:android_package_installer/android_package_installer.dart'; | ||||||
| import 'package:android_package_manager/android_package_manager.dart'; | import 'package:android_package_manager/android_package_manager.dart'; | ||||||
|  | import 'package:connectivity_plus/connectivity_plus.dart'; | ||||||
| import 'package:device_info_plus/device_info_plus.dart'; | import 'package:device_info_plus/device_info_plus.dart'; | ||||||
| import 'package:easy_localization/easy_localization.dart'; | import 'package:easy_localization/easy_localization.dart'; | ||||||
| import 'package:flutter/material.dart'; | import 'package:flutter/material.dart'; | ||||||
| @@ -366,6 +367,9 @@ class AppsProvider with ChangeNotifier { | |||||||
|     if (!settingsProvider.enableBackgroundUpdates) { |     if (!settingsProvider.enableBackgroundUpdates) { | ||||||
|       return false; |       return false; | ||||||
|     } |     } | ||||||
|  |     if (app.additionalSettings['exemptFromBackgroundUpdates'] == true) { | ||||||
|  |       return false; | ||||||
|  |     } | ||||||
|     if (app.apkUrls.length > 1) { |     if (app.apkUrls.length > 1) { | ||||||
|       // Manual API selection means silent install is not possible |       // Manual API selection means silent install is not possible | ||||||
|       return false; |       return false; | ||||||
| @@ -1320,6 +1324,12 @@ Future<void> bgUpdateCheck(int taskId, Map<String, dynamic>? params) async { | |||||||
|     // If in update mode... |     // If in update mode... | ||||||
|     var didCompleteChecking = false; |     var didCompleteChecking = false; | ||||||
|     CheckingUpdatesNotification? notif; |     CheckingUpdatesNotification? notif; | ||||||
|  |     var networkRestricted = false; | ||||||
|  |     if (settingsProvider.bgUpdatesOnWiFiOnly) { | ||||||
|  |       var netResult = await (Connectivity().checkConnectivity()); | ||||||
|  |       networkRestricted = (netResult != ConnectivityResult.wifi) && | ||||||
|  |           (netResult != ConnectivityResult.ethernet); | ||||||
|  |     } | ||||||
|     // Loop through all updates and check each |     // Loop through all updates and check each | ||||||
|     for (int i = 0; i < toCheck.length; i++) { |     for (int i = 0; i < toCheck.length; i++) { | ||||||
|       var appId = toCheck[i].key; |       var appId = toCheck[i].key; | ||||||
| @@ -1332,8 +1342,9 @@ Future<void> bgUpdateCheck(int taskId, Map<String, dynamic>? params) async { | |||||||
|               cancelExisting: true); |               cancelExisting: true); | ||||||
|           App? newApp = await appsProvider.checkUpdate(appId); |           App? newApp = await appsProvider.checkUpdate(appId); | ||||||
|           if (newApp != null) { |           if (newApp != null) { | ||||||
|             if (!(await appsProvider.canInstallSilently( |             if (networkRestricted || | ||||||
|                 app!.app, settingsProvider))) { |                 !(await appsProvider.canInstallSilently( | ||||||
|  |                     app!.app, settingsProvider))) { | ||||||
|               notificationsProvider.notify( |               notificationsProvider.notify( | ||||||
|                   UpdateNotification([newApp], id: newApp.id.hashCode - 1)); |                   UpdateNotification([newApp], id: newApp.id.hashCode - 1)); | ||||||
|             } else { |             } else { | ||||||
|   | |||||||
| @@ -319,6 +319,15 @@ class SettingsProvider with ChangeNotifier { | |||||||
|     notifyListeners(); |     notifyListeners(); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   bool get bgUpdatesOnWiFiOnly { | ||||||
|  |     return prefs?.getBool('bgUpdatesOnWiFiOnly') ?? false; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   set bgUpdatesOnWiFiOnly(bool val) { | ||||||
|  |     prefs?.setBool('bgUpdatesOnWiFiOnly', val); | ||||||
|  |     notifyListeners(); | ||||||
|  |   } | ||||||
|  |  | ||||||
|   DateTime get lastBGCheckTime { |   DateTime get lastBGCheckTime { | ||||||
|     int? temp = prefs?.getInt('lastBGCheckTime'); |     int? temp = prefs?.getInt('lastBGCheckTime'); | ||||||
|     return temp != null |     return temp != null | ||||||
|   | |||||||
| @@ -25,6 +25,7 @@ import 'package:obtainium/app_sources/sourceforge.dart'; | |||||||
| import 'package:obtainium/app_sources/sourcehut.dart'; | import 'package:obtainium/app_sources/sourcehut.dart'; | ||||||
| import 'package:obtainium/app_sources/steammobile.dart'; | import 'package:obtainium/app_sources/steammobile.dart'; | ||||||
| import 'package:obtainium/app_sources/telegramapp.dart'; | import 'package:obtainium/app_sources/telegramapp.dart'; | ||||||
|  | import 'package:obtainium/app_sources/vlc.dart'; | ||||||
| import 'package:obtainium/components/generated_form.dart'; | import 'package:obtainium/components/generated_form.dart'; | ||||||
| import 'package:obtainium/custom_errors.dart'; | import 'package:obtainium/custom_errors.dart'; | ||||||
| import 'package:obtainium/mass_app_sources/githubstars.dart'; | import 'package:obtainium/mass_app_sources/githubstars.dart'; | ||||||
| @@ -329,16 +330,23 @@ abstract class AppSource { | |||||||
|     name = runtimeType.toString(); |     name = runtimeType.toString(); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   overrideVersionDetectionFormDefault(String vd, bool disableStandard) { |   overrideVersionDetectionFormDefault(String vd, | ||||||
|  |       {bool disableStandard = false, bool disableRelDate = false}) { | ||||||
|     additionalAppSpecificSourceAgnosticSettingFormItems = |     additionalAppSpecificSourceAgnosticSettingFormItems = | ||||||
|         additionalAppSpecificSourceAgnosticSettingFormItems.map((e) { |         additionalAppSpecificSourceAgnosticSettingFormItems.map((e) { | ||||||
|       return e.map((e2) { |       return e.map((e2) { | ||||||
|         if (e2.key == 'versionDetection') { |         if (e2.key == 'versionDetection') { | ||||||
|           var item = e2 as GeneratedFormDropdown; |           var item = e2 as GeneratedFormDropdown; | ||||||
|           item.defaultValue = vd; |           item.defaultValue = vd; | ||||||
|  |           item.disabledOptKeys = []; | ||||||
|           if (disableStandard) { |           if (disableStandard) { | ||||||
|             item.disabledOptKeys = ['standardVersionDetection']; |             item.disabledOptKeys?.add('standardVersionDetection'); | ||||||
|           } |           } | ||||||
|  |           if (disableRelDate) { | ||||||
|  |             item.disabledOptKeys?.add('releaseDateAsVersion'); | ||||||
|  |           } | ||||||
|  |           item.disabledOptKeys = | ||||||
|  |               item.disabledOptKeys?.where((element) => element != vd).toList(); | ||||||
|         } |         } | ||||||
|         return e2; |         return e2; | ||||||
|       }).toList(); |       }).toList(); | ||||||
| @@ -417,7 +425,11 @@ abstract class AppSource { | |||||||
|       GeneratedFormSwitch('autoApkFilterByArch', |       GeneratedFormSwitch('autoApkFilterByArch', | ||||||
|           label: tr('autoApkFilterByArch'), defaultValue: true) |           label: tr('autoApkFilterByArch'), defaultValue: true) | ||||||
|     ], |     ], | ||||||
|     [GeneratedFormTextField('appName', label: tr('appName'), required: false)] |     [GeneratedFormTextField('appName', label: tr('appName'), required: false)], | ||||||
|  |     [ | ||||||
|  |       GeneratedFormSwitch('exemptFromBackgroundUpdates', | ||||||
|  |           label: tr('exemptFromBackgroundUpdates')) | ||||||
|  |     ] | ||||||
|   ]; |   ]; | ||||||
|  |  | ||||||
|   // Previous 2 variables combined into one at runtime for convenient usage |   // Previous 2 variables combined into one at runtime for convenient usage | ||||||
| @@ -516,7 +528,7 @@ class SourceProvider { | |||||||
|         // APKCombo(), // Can't get past their scraping blocking yet (get 403 Forbidden) |         // APKCombo(), // Can't get past their scraping blocking yet (get 403 Forbidden) | ||||||
|         Mullvad(), |         Mullvad(), | ||||||
|         Signal(), |         Signal(), | ||||||
|         // VLC(), // As of 2023-08-26 this site randomly messes up the 'latest' version (one minute it's 3.5.4, next minute back to 3.5.3) |         VLC(), // As of 2023-08-26 this site randomly messes up the 'latest' version (one minute it's 3.5.4, next minute back to 3.5.3) | ||||||
|         // WhatsApp(), // As of 2023-03-20 this is unusable as the version on the webpage is months out of date |         // WhatsApp(), // As of 2023-03-20 this is unusable as the version on the webpage is months out of date | ||||||
|         TelegramApp(), |         TelegramApp(), | ||||||
|         SteamMobile(), |         SteamMobile(), | ||||||
|   | |||||||
							
								
								
									
										35
									
								
								pubspec.lock
									
									
									
									
									
								
							
							
						
						
									
										35
									
								
								pubspec.lock
									
									
									
									
									
								
							| @@ -29,12 +29,11 @@ packages: | |||||||
|   android_package_manager: |   android_package_manager: | ||||||
|     dependency: "direct main" |     dependency: "direct main" | ||||||
|     description: |     description: | ||||||
|       path: "." |       name: android_package_manager | ||||||
|       ref: master |       sha256: b873fe5856f7c442aca9751dac05d117285be9e4de08eb15d1ffb811fd1b688d | ||||||
|       resolved-ref: c7c2f992a9dc452393c94d96cdf2b1f5a5ce7c80 |       url: "https://pub.dev" | ||||||
|       url: "https://github.com/ImranR98/android_package_manager" |     source: hosted | ||||||
|     source: git |     version: "0.6.0" | ||||||
|     version: "0.5.4" |  | ||||||
|   animations: |   animations: | ||||||
|     dependency: "direct main" |     dependency: "direct main" | ||||||
|     description: |     description: | ||||||
| @@ -115,6 +114,22 @@ packages: | |||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "1.17.2" |     version: "1.17.2" | ||||||
|  |   connectivity_plus: | ||||||
|  |     dependency: "direct main" | ||||||
|  |     description: | ||||||
|  |       name: connectivity_plus | ||||||
|  |       sha256: "77a180d6938f78ca7d2382d2240eb626c0f6a735d0bfdce227d8ffb80f95c48b" | ||||||
|  |       url: "https://pub.dev" | ||||||
|  |     source: hosted | ||||||
|  |     version: "4.0.2" | ||||||
|  |   connectivity_plus_platform_interface: | ||||||
|  |     dependency: transitive | ||||||
|  |     description: | ||||||
|  |       name: connectivity_plus_platform_interface | ||||||
|  |       sha256: cf1d1c28f4416f8c654d7dc3cd638ec586076255d407cef3ddbdaf178272a71a | ||||||
|  |       url: "https://pub.dev" | ||||||
|  |     source: hosted | ||||||
|  |     version: "1.2.4" | ||||||
|   convert: |   convert: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
| @@ -455,6 +470,14 @@ packages: | |||||||
|       url: "https://pub.dev" |       url: "https://pub.dev" | ||||||
|     source: hosted |     source: hosted | ||||||
|     version: "1.0.0" |     version: "1.0.0" | ||||||
|  |   nm: | ||||||
|  |     dependency: transitive | ||||||
|  |     description: | ||||||
|  |       name: nm | ||||||
|  |       sha256: "2c9aae4127bdc8993206464fcc063611e0e36e72018696cd9631023a31b24254" | ||||||
|  |       url: "https://pub.dev" | ||||||
|  |     source: hosted | ||||||
|  |     version: "0.5.0" | ||||||
|   path: |   path: | ||||||
|     dependency: transitive |     dependency: transitive | ||||||
|     description: |     description: | ||||||
|   | |||||||
| @@ -17,7 +17,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 | # 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 | # 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. | # of the product and file versions while build-number is used as the build suffix. | ||||||
| version: 0.14.1+193 # When changing this, update the tag in main() accordingly | version: 0.14.2+194 # When changing this, update the tag in main() accordingly | ||||||
|  |  | ||||||
| environment: | environment: | ||||||
|   sdk: '>=2.18.2 <3.0.0' |   sdk: '>=2.18.2 <3.0.0' | ||||||
| @@ -55,10 +55,7 @@ dependencies: | |||||||
|     git: |     git: | ||||||
|       url: https://github.com/ImranR98/android_package_installer |       url: https://github.com/ImranR98/android_package_installer | ||||||
|       ref: main |       ref: main | ||||||
|   android_package_manager: |   android_package_manager: ^0.6.0 | ||||||
|     git: |  | ||||||
|         url: https://github.com/ImranR98/android_package_manager |  | ||||||
|         ref: master |  | ||||||
|   share_plus: ^7.0.0 |   share_plus: ^7.0.0 | ||||||
|   android_alarm_manager_plus: ^3.0.0 |   android_alarm_manager_plus: ^3.0.0 | ||||||
|   sqflite: ^2.2.0+3 |   sqflite: ^2.2.0+3 | ||||||
| @@ -67,6 +64,7 @@ dependencies: | |||||||
|   flutter_markdown: ^0.6.14 |   flutter_markdown: ^0.6.14 | ||||||
|   flutter_archive: ^5.0.0 |   flutter_archive: ^5.0.0 | ||||||
|   hsluv: ^1.1.3 |   hsluv: ^1.1.3 | ||||||
|  |   connectivity_plus: ^4.0.2 | ||||||
|  |  | ||||||
| dev_dependencies: | dev_dependencies: | ||||||
|   flutter_test: |   flutter_test: | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user