mirror of
https://github.com/ImranR98/Obtainium.git
synced 2025-08-01 05:10:15 +02:00
Compare commits
16 Commits
v0.14.19-b
...
v0.14.22-b
Author | SHA1 | Date | |
---|---|---|---|
|
5fbb1c2e32 | ||
|
850dd53c69 | ||
|
e3baf91037 | ||
|
4c811c9c04 | ||
|
4bc9f5826e | ||
|
9f19e4dc83 | ||
|
c9cb865c9c | ||
|
b8a7dd984d | ||
|
3ede46c445 | ||
|
87c4af94d3 | ||
|
7e85ccaf28 | ||
|
db3a262410 | ||
|
70162da491 | ||
|
f3632a4033 | ||
|
2f4e176116 | ||
|
3ea8dc598c |
@@ -34,10 +34,10 @@
|
|||||||
"githubStarredRepos": "Repozytoria GitHub oznaczone gwiazdką",
|
"githubStarredRepos": "Repozytoria GitHub oznaczone gwiazdką",
|
||||||
"uname": "Nazwa użytkownika",
|
"uname": "Nazwa użytkownika",
|
||||||
"wrongArgNum": "Nieprawidłowa liczba podanych argumentów",
|
"wrongArgNum": "Nieprawidłowa liczba podanych argumentów",
|
||||||
"xIsTrackOnly": "{} jest tylko obserwowana",
|
"xIsTrackOnly": "{} jest tylko obserwowane",
|
||||||
"source": "Źródło",
|
"source": "Źródło",
|
||||||
"app": "Aplikacja",
|
"app": "Aplikacja",
|
||||||
"appsFromSourceAreTrackOnly": "Aplikacje z tego źródła są „Obserwowane”.",
|
"appsFromSourceAreTrackOnly": "Aplikacje z tego źródła są „tylko obserwowane”.",
|
||||||
"youPickedTrackOnly": "Wybrano opcję „Tylko obserwuj”.",
|
"youPickedTrackOnly": "Wybrano opcję „Tylko obserwuj”.",
|
||||||
"trackOnlyAppDescription": "Aplikacja będzie obserwowana pod kątem aktualizacji, ale Obtainium nie będzie w stanie jej pobrać ani zainstalować.",
|
"trackOnlyAppDescription": "Aplikacja będzie obserwowana pod kątem aktualizacji, ale Obtainium nie będzie w stanie jej pobrać ani zainstalować.",
|
||||||
"cancelled": "Anulowano",
|
"cancelled": "Anulowano",
|
||||||
@@ -52,7 +52,7 @@
|
|||||||
"additionalOptsFor": "Dodatkowe opcje dla {}",
|
"additionalOptsFor": "Dodatkowe opcje dla {}",
|
||||||
"supportedSources": "Obsługiwane źródła",
|
"supportedSources": "Obsługiwane źródła",
|
||||||
"trackOnlyInBrackets": "(tylko obserwowane)",
|
"trackOnlyInBrackets": "(tylko obserwowane)",
|
||||||
"searchableInBrackets": "(Wyszukiwalne)",
|
"searchableInBrackets": "(wyszukiwalne)",
|
||||||
"appsString": "Aplikacje",
|
"appsString": "Aplikacje",
|
||||||
"noApps": "Brak aplikacji",
|
"noApps": "Brak aplikacji",
|
||||||
"noAppsForFilter": "Brak aplikacji dla filtra",
|
"noAppsForFilter": "Brak aplikacji dla filtra",
|
||||||
@@ -70,7 +70,7 @@
|
|||||||
"removeSelectedApps": "Usuń wybrane aplikacje",
|
"removeSelectedApps": "Usuń wybrane aplikacje",
|
||||||
"updateX": "Zaktualizuj {}",
|
"updateX": "Zaktualizuj {}",
|
||||||
"installX": "Zainstaluj {}",
|
"installX": "Zainstaluj {}",
|
||||||
"markXTrackOnlyAsUpdated": "Oznacz {}\n(Tylko obserwowana)\njako zaktualizowaną",
|
"markXTrackOnlyAsUpdated": "Oznacz {}\n(tylko obserwowana)\njako zaktualizowaną",
|
||||||
"changeX": "Zmień {}",
|
"changeX": "Zmień {}",
|
||||||
"installUpdateApps": "Instaluj/aktualizuj aplikacje",
|
"installUpdateApps": "Instaluj/aktualizuj aplikacje",
|
||||||
"installUpdateSelectedApps": "Zainstaluj/zaktualizuj wybrane aplikacje",
|
"installUpdateSelectedApps": "Zainstaluj/zaktualizuj wybrane aplikacje",
|
||||||
@@ -261,11 +261,11 @@
|
|||||||
"autoExportOnChanges": "Automatyczny eksport po wprowadzeniu zmian",
|
"autoExportOnChanges": "Automatyczny eksport po wprowadzeniu zmian",
|
||||||
"filterVersionsByRegEx": "Filtruj wersje według wyrażenia regularnego",
|
"filterVersionsByRegEx": "Filtruj wersje według wyrażenia regularnego",
|
||||||
"trySelectingSuggestedVersionCode": "Spróbuj wybierać sugerowany kod wersji APK",
|
"trySelectingSuggestedVersionCode": "Spróbuj wybierać sugerowany kod wersji APK",
|
||||||
"dontSortReleasesList": "Retain release order from API",
|
"dontSortReleasesList": "Utrzymaj kolejność wydań z interfejsu API",
|
||||||
"reverseSort": "Reverse sorting",
|
"reverseSort": "Odwrotne sortowanie",
|
||||||
"debugMenu": "Debug Menu",
|
"debugMenu": "Menu debugowania",
|
||||||
"bgTaskStarted": "Background task started - check logs.",
|
"bgTaskStarted": "Uruchomiono zadanie w tle - sprawdź logi.",
|
||||||
"runBgCheckNow": "Run Background Update Check Now",
|
"runBgCheckNow": "Wymuś sprawdzenie aktualizacji w tle",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "Usunąć aplikację?",
|
"one": "Usunąć aplikację?",
|
||||||
"few": "Usunąć aplikacje?",
|
"few": "Usunąć aplikacje?",
|
||||||
|
@@ -128,7 +128,7 @@
|
|||||||
"pinUpdates": "Fixar atualizações no topo da visão de Apps",
|
"pinUpdates": "Fixar atualizações no topo da visão de Apps",
|
||||||
"updates": "Atualizações",
|
"updates": "Atualizações",
|
||||||
"sourceSpecific": "Específico a fonte",
|
"sourceSpecific": "Específico a fonte",
|
||||||
"appSource": "Fonte de Apps",
|
"appSource": "Fonte do App",
|
||||||
"noLogs": "Sem Logs",
|
"noLogs": "Sem Logs",
|
||||||
"appLogs": "Logs do App",
|
"appLogs": "Logs do App",
|
||||||
"close": "Fechar",
|
"close": "Fechar",
|
||||||
@@ -250,19 +250,19 @@
|
|||||||
"intermediateLinkNotFound": "Link intermediário não encontrado",
|
"intermediateLinkNotFound": "Link intermediário não encontrado",
|
||||||
"exemptFromBackgroundUpdates": "Isento de atualizações em segundo plano (se ativadas)",
|
"exemptFromBackgroundUpdates": "Isento de atualizações em segundo plano (se ativadas)",
|
||||||
"bgUpdatesOnWiFiOnly": "Desative atualizações em segundo plano quando não estiver em WiFi",
|
"bgUpdatesOnWiFiOnly": "Desative atualizações em segundo plano quando não estiver em WiFi",
|
||||||
"autoSelectHighestVersionCode": "Auto-select highest versionCode APK",
|
"autoSelectHighestVersionCode": "Auto-selecionar o maior codigo de versão",
|
||||||
"versionExtractionRegEx": "Version Extraction RegEx",
|
"versionExtractionRegEx": "RegEx para Extração de Versão",
|
||||||
"matchGroupToUse": "Match Group to Use",
|
"matchGroupToUse": "Grupo de Seleção para Usar",
|
||||||
"highlightTouchTargets": "Highlight less obvious touch targets",
|
"highlightTouchTargets": "Destaque areas de toque menos óbvias",
|
||||||
"pickExportDir": "Pick Export Directory",
|
"pickExportDir": "Escolher Diretorio de Exportação",
|
||||||
"autoExportOnChanges": "Auto-export on changes",
|
"autoExportOnChanges": "Auto-exportar em mudanças",
|
||||||
"filterVersionsByRegEx": "Filter Versions by Regular Expression",
|
"filterVersionsByRegEx": "Filtrar Versões por Expressão Regular",
|
||||||
"trySelectingSuggestedVersionCode": "Try selecting suggested versionCode APK",
|
"trySelectingSuggestedVersionCode": "Tente selecionar a versão sugerida",
|
||||||
"dontSortReleasesList": "Retain release order from API",
|
"dontSortReleasesList": "Reter a ordem de lançamento da API",
|
||||||
"reverseSort": "Reverse sorting",
|
"reverseSort": "Ordenação reversa",
|
||||||
"debugMenu": "Debug Menu",
|
"debugMenu": "Menu Debug",
|
||||||
"bgTaskStarted": "Background task started - check logs.",
|
"bgTaskStarted": "Tarefa em segundo plano iniciada - verifique os logs.",
|
||||||
"runBgCheckNow": "Run Background Update Check Now",
|
"runBgCheckNow": "Execute a verificação de atualização em segundo plano agora",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "Remover App?",
|
"one": "Remover App?",
|
||||||
"other": "Remover Apps?"
|
"other": "Remover Apps?"
|
||||||
|
@@ -236,30 +236,33 @@
|
|||||||
"addInfoInSettings": "Добавьте эту информацию в Настройки.",
|
"addInfoInSettings": "Добавьте эту информацию в Настройки.",
|
||||||
"githubSourceNote": "Лимит запросов GitHub можно обойти, используя ключ API.",
|
"githubSourceNote": "Лимит запросов GitHub можно обойти, используя ключ API.",
|
||||||
"gitlabSourceNote": "Извлечение APK из GitLab может не работать без ключа API.",
|
"gitlabSourceNote": "Извлечение APK из GitLab может не работать без ключа API.",
|
||||||
"sortByFileNamesNotLinks": "Sort by file names instead of full links",
|
"sortByFileNamesNotLinks": "Сортировать по именам файлов, а не по полным ссылкам",
|
||||||
"filterReleaseNotesByRegEx": "Filter Release Notes by Regular Expression",
|
"filterReleaseNotesByRegEx": "Фильтровать примечания к выпуску по регулярному выражению",
|
||||||
"customLinkFilterRegex": "Custom APK Link Filter by Regular Expression (Default '.apk$')",
|
"customLinkFilterRegex": "Пользовательский фильтр ссылок APK по регулярному выражению (по умолчанию '.apk$')",
|
||||||
"appsPossiblyUpdated": "App Updates Attempted",
|
"appsPossiblyUpdated": "Попытки обновления приложений",
|
||||||
"appsPossiblyUpdatedNotifDescription": "Notifies the user that updates to one or more Apps were potentially applied in the background",
|
"appsPossiblyUpdatedNotifDescription": "Уведомляет пользователя о возможных обновлениях одного или нескольких приложений в фоновом режиме",
|
||||||
"xWasPossiblyUpdatedToY": "{} may have been updated to {}.",
|
"xWasPossiblyUpdatedToY": "{} возможно был обновлен до {}.",
|
||||||
"backgroundUpdateReqsExplanation": "Background updates may not be possible for all apps.",
|
"enableBackgroundUpdates": "Включить обновления в фоне",
|
||||||
"backgroundUpdateLimitsExplanation": "The success of a background install can only be determined when Obtainium is opened.",
|
"backgroundUpdateReqsExplanation": "Фоновые обновления могут быть невозможны для всех приложений.",
|
||||||
"verifyLatestTag": "Verify the 'latest' tag",
|
"backgroundUpdateLimitsExplanation": "Успех фоновой установки можно определить только после открытия Obtainium.",
|
||||||
"exemptFromBackgroundUpdates": "Exempt from background updates (if enabled)",
|
"verifyLatestTag": "Проверьте тег 'последний'",
|
||||||
"bgUpdatesOnWiFiOnly": "Disable background updates when not on WiFi",
|
"intermediateLinkRegex": "Фильтр ссылок 'промежуточного' типа для приоритетного посещения",
|
||||||
"autoSelectHighestVersionCode": "Auto-select highest versionCode APK",
|
"intermediateLinkNotFound": "Промежуточная ссылка не найдена",
|
||||||
"versionExtractionRegEx": "Version Extraction RegEx",
|
"exemptFromBackgroundUpdates": "Исключить из фоновых обновлений (если включено)",
|
||||||
"matchGroupToUse": "Match Group to Use",
|
"bgUpdatesOnWiFiOnly": "Отключить фоновые обновления, если нет соединения с Wi-Fi",
|
||||||
"highlightTouchTargets": "Highlight less obvious touch targets",
|
"autoSelectHighestVersionCode": "Автоматически выбирать APK с наивысшим кодом версии",
|
||||||
"pickExportDir": "Pick Export Directory",
|
"versionExtractionRegEx": "Регулярное выражение для извлечения версии",
|
||||||
"autoExportOnChanges": "Auto-export on changes",
|
"matchGroupToUse": "Выберите группу для использования",
|
||||||
"filterVersionsByRegEx": "Filter Versions by Regular Expression",
|
"highlightTouchTargets": "Выделить менее очевидные элементы управления касанием",
|
||||||
"trySelectingSuggestedVersionCode": "Try selecting suggested versionCode APK",
|
"pickExportDir": "Выбрать каталог для экспорта",
|
||||||
"dontSortReleasesList": "Retain release order from API",
|
"autoExportOnChanges": "Автоэкспорт при изменениях",
|
||||||
"reverseSort": "Reverse sorting",
|
"filterVersionsByRegEx": "Фильтровать версии по регулярному выражению",
|
||||||
"debugMenu": "Debug Menu",
|
"trySelectingSuggestedVersionCode": "Попробуйте выбрать предложенный код версии APK",
|
||||||
"bgTaskStarted": "Background task started - check logs.",
|
"dontSortReleasesList": "Сохранить порядок выпусков от API",
|
||||||
"runBgCheckNow": "Run Background Update Check Now",
|
"reverseSort": "Обратная сортировка",
|
||||||
|
"debugMenu": "Меню Отладки",
|
||||||
|
"bgTaskStarted": "Фоновая задача начата - проверьте журналы.",
|
||||||
|
"runBgCheckNow": "Запустить проверку фонового обновления сейчас",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "Удалить приложение?",
|
"one": "Удалить приложение?",
|
||||||
"other": "Удалить приложения?"
|
"other": "Удалить приложения?"
|
||||||
@@ -305,11 +308,11 @@
|
|||||||
"other": "У {} и ещё {} приложений есть обновления."
|
"other": "У {} и ещё {} приложений есть обновления."
|
||||||
},
|
},
|
||||||
"xAndNMoreUpdatesInstalled": {
|
"xAndNMoreUpdatesInstalled": {
|
||||||
"one": "{} и еще 1 приложение были обновлены.",
|
"one": "{} и ещё 1 приложение были обновлены.",
|
||||||
"other": "{} и еще {} приложений были обновлены."
|
"other": "{} и ещё {} приложений были обновлены."
|
||||||
},
|
},
|
||||||
"xAndNMoreUpdatesPossiblyInstalled": {
|
"xAndNMoreUpdatesPossiblyInstalled": {
|
||||||
"one": "{} and 1 more app may have been updated.",
|
"one": "{} и ещё 1 приложение могли быть обновлены.",
|
||||||
"other": "{} and {} more apps may have been updated."
|
"other": "{} и ещё {} приложений могли быть обновлены."
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -238,31 +238,31 @@
|
|||||||
"gitlabSourceNote": "未使用访问令牌时可能无法从 GitLab 获取 APK 文件。",
|
"gitlabSourceNote": "未使用访问令牌时可能无法从 GitLab 获取 APK 文件。",
|
||||||
"sortByFileNamesNotLinks": "使用文件名代替链接进行排序",
|
"sortByFileNamesNotLinks": "使用文件名代替链接进行排序",
|
||||||
"filterReleaseNotesByRegEx": "使用正则表达式筛选发行说明",
|
"filterReleaseNotesByRegEx": "使用正则表达式筛选发行说明",
|
||||||
"customLinkFilterRegex": "使用正则表达式自定义链接筛选(默认模式为“.apk$”)",
|
"customLinkFilterRegex": "使用正则表达式筛选自定义来源 APK 文件链接\n(未填写时,默认匹配模式为“.apk$”)",
|
||||||
"appsPossiblyUpdated": "已尝试更新应用",
|
"appsPossiblyUpdated": "已尝试更新应用",
|
||||||
"appsPossiblyUpdatedNotifDescription": "当应用已尝试在后台更新时发送通知",
|
"appsPossiblyUpdatedNotifDescription": "当应用已尝试在后台更新时发送通知",
|
||||||
"xWasPossiblyUpdatedToY": "已尝试将 {} 更新至 {}。",
|
"xWasPossiblyUpdatedToY": "已尝试将“{}”更新至 {}。",
|
||||||
"enableBackgroundUpdates": "启用后台更新",
|
"enableBackgroundUpdates": "启用后台更新",
|
||||||
"backgroundUpdateReqsExplanation": "后台更新未必适用于所有的应用。",
|
"backgroundUpdateReqsExplanation": "后台更新未必适用于所有的应用。",
|
||||||
"backgroundUpdateLimitsExplanation": "只有在启动 Obtainium 时才能确认安装是否成功。",
|
"backgroundUpdateLimitsExplanation": "只有在启动 Obtainium 时才能确认安装是否成功。",
|
||||||
"verifyLatestTag": "验证“Latest”标签",
|
"verifyLatestTag": "验证“Latest”标签",
|
||||||
"intermediateLinkRegex": "首先访问“中间”链接的过滤器",
|
"intermediateLinkRegex": "筛选一个首先访问的“中转”链接(正则表达式)",
|
||||||
"intermediateLinkNotFound": "中间链接未找到",
|
"intermediateLinkNotFound": "未找到“中转”链接",
|
||||||
"exemptFromBackgroundUpdates": "禁用后台更新(如果全局设置启用)",
|
"exemptFromBackgroundUpdates": "单独禁用后台更新(若已经全局启用)",
|
||||||
"bgUpdatesOnWiFiOnly": "不在连接 WiFi 时禁用后台更新",
|
"bgUpdatesOnWiFiOnly": "未连接 Wi-Fi 时禁用后台更新",
|
||||||
"autoSelectHighestVersionCode": "自动选择最高版本号 APK",
|
"autoSelectHighestVersionCode": "自动选择版本号最高的 APK 文件",
|
||||||
"versionExtractionRegEx": "版本提取正则表达式",
|
"versionExtractionRegEx": "获取版本号的正则表达式",
|
||||||
"matchGroupToUse": "匹配要使用的组",
|
"matchGroupToUse": "引用的捕获组",
|
||||||
"highlightTouchTargets": "突出显示不明显的触摸目标",
|
"highlightTouchTargets": "突出展示不明显的触摸区域",
|
||||||
"pickExportDir": "选择导出目录",
|
"pickExportDir": "选择导出文件夹",
|
||||||
"autoExportOnChanges": "修改时自动导出",
|
"autoExportOnChanges": "数据变更时自动导出",
|
||||||
"filterVersionsByRegEx": "使用正则表达式筛选版本",
|
"filterVersionsByRegEx": "使用正则表达式筛选版本号",
|
||||||
"trySelectingSuggestedVersionCode": "尝试选择推荐版本 APK",
|
"trySelectingSuggestedVersionCode": "尝试选择推荐版本的 APK 文件",
|
||||||
"dontSortReleasesList": "Retain release order from API",
|
"dontSortReleasesList": "保持来自 API 的发行顺序",
|
||||||
"reverseSort": "Reverse sorting",
|
"reverseSort": "反转排序",
|
||||||
"debugMenu": "Debug Menu",
|
"debugMenu": "调试选项",
|
||||||
"bgTaskStarted": "Background task started - check logs.",
|
"bgTaskStarted": "后台任务已启动 - 详见日志",
|
||||||
"runBgCheckNow": "Run Background Update Check Now",
|
"runBgCheckNow": "立即进行后台更新检查",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "是否删除应用?",
|
"one": "是否删除应用?",
|
||||||
"other": "是否删除应用?"
|
"other": "是否删除应用?"
|
||||||
|
@@ -22,16 +22,19 @@ class APKPure extends AppSource {
|
|||||||
APKPure() {
|
APKPure() {
|
||||||
host = 'apkpure.com';
|
host = 'apkpure.com';
|
||||||
allowSubDomains = true;
|
allowSubDomains = true;
|
||||||
|
naiveStandardVersionDetection = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String sourceSpecificStandardizeURL(String url) {
|
String sourceSpecificStandardizeURL(String url) {
|
||||||
RegExp standardUrlRegExB = RegExp('^https?://m.$host/+[^/]+/+[^/]+');
|
RegExp standardUrlRegExB =
|
||||||
|
RegExp('^https?://m.$host/+[^/]+/+[^/]+(/+[^/]+)?');
|
||||||
RegExpMatch? match = standardUrlRegExB.firstMatch(url.toLowerCase());
|
RegExpMatch? match = standardUrlRegExB.firstMatch(url.toLowerCase());
|
||||||
if (match != null) {
|
if (match != null) {
|
||||||
url = 'https://$host${Uri.parse(url).path}';
|
url = 'https://$host${Uri.parse(url).path}';
|
||||||
}
|
}
|
||||||
RegExp standardUrlRegExA = RegExp('^https?://$host/+[^/]+/+[^/]+');
|
RegExp standardUrlRegExA =
|
||||||
|
RegExp('^https?://$host/+[^/]+/+[^/]+(/+[^/]+)?');
|
||||||
match = standardUrlRegExA.firstMatch(url.toLowerCase());
|
match = standardUrlRegExA.firstMatch(url.toLowerCase());
|
||||||
if (match == null) {
|
if (match == null) {
|
||||||
throw InvalidURLError(name);
|
throw InvalidURLError(name);
|
||||||
|
@@ -9,6 +9,7 @@ class Aptoide extends AppSource {
|
|||||||
host = 'aptoide.com';
|
host = 'aptoide.com';
|
||||||
name = tr('Aptoide');
|
name = tr('Aptoide');
|
||||||
allowSubDomains = true;
|
allowSubDomains = true;
|
||||||
|
naiveStandardVersionDetection = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
@@ -8,6 +8,7 @@ class Uptodown extends AppSource {
|
|||||||
Uptodown() {
|
Uptodown() {
|
||||||
host = 'uptodown.com';
|
host = 'uptodown.com';
|
||||||
allowSubDomains = true;
|
allowSubDomains = true;
|
||||||
|
naiveStandardVersionDetection = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@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.19';
|
const String currentVersion = '0.14.22';
|
||||||
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
|
||||||
|
|
||||||
|
@@ -102,11 +102,12 @@ class _ImportExportPageState extends State<ImportExportPage> {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
runObtainiumExport() async {
|
runObtainiumExport({bool pickOnly = false}) async {
|
||||||
HapticFeedback.selectionClick();
|
HapticFeedback.selectionClick();
|
||||||
appsProvider
|
appsProvider
|
||||||
.exportApps(
|
.exportApps(
|
||||||
pickOnly: (await settingsProvider.getExportDir()) == null,
|
pickOnly:
|
||||||
|
pickOnly || (await settingsProvider.getExportDir()) == null,
|
||||||
sp: settingsProvider)
|
sp: settingsProvider)
|
||||||
.then((String? result) {
|
.then((String? result) {
|
||||||
if (result != null) {
|
if (result != null) {
|
||||||
@@ -320,21 +321,38 @@ class _ImportExportPageState extends State<ImportExportPage> {
|
|||||||
onPressed: appsProvider.apps.isEmpty ||
|
onPressed: appsProvider.apps.isEmpty ||
|
||||||
importInProgress
|
importInProgress
|
||||||
? null
|
? null
|
||||||
: runObtainiumExport,
|
: () {
|
||||||
child: Text(tr(snapshot.data != null
|
runObtainiumExport(pickOnly: true);
|
||||||
? 'obtainiumExport'
|
},
|
||||||
: 'pickExportDir')),
|
child: Text(tr('pickExportDir')),
|
||||||
)),
|
)),
|
||||||
const SizedBox(
|
const SizedBox(
|
||||||
width: 16,
|
width: 16,
|
||||||
),
|
),
|
||||||
|
Expanded(
|
||||||
|
child: TextButton(
|
||||||
|
style: outlineButtonStyle,
|
||||||
|
onPressed: appsProvider.apps.isEmpty ||
|
||||||
|
importInProgress ||
|
||||||
|
snapshot.data == null
|
||||||
|
? null
|
||||||
|
: runObtainiumExport,
|
||||||
|
child: Text(tr('obtainiumExport')),
|
||||||
|
)),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
const SizedBox(
|
||||||
|
height: 8,
|
||||||
|
),
|
||||||
|
Row(
|
||||||
|
children: [
|
||||||
Expanded(
|
Expanded(
|
||||||
child: TextButton(
|
child: TextButton(
|
||||||
style: outlineButtonStyle,
|
style: outlineButtonStyle,
|
||||||
onPressed: importInProgress
|
onPressed: importInProgress
|
||||||
? null
|
? null
|
||||||
: runObtainiumImport,
|
: runObtainiumImport,
|
||||||
child: Text(tr('obtainiumImport'))))
|
child: Text(tr('obtainiumImport')))),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
if (snapshot.data != null)
|
if (snapshot.data != null)
|
||||||
|
@@ -709,14 +709,21 @@ class AppsProvider with ChangeNotifier {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool isVersionDetectionPossible(AppInMemory? app) {
|
bool isVersionDetectionPossible(AppInMemory? app) {
|
||||||
return app?.app.additionalSettings['trackOnly'] != true &&
|
if (app?.app == null) {
|
||||||
app?.app.additionalSettings['versionDetection'] !=
|
return false;
|
||||||
|
}
|
||||||
|
var naiveStandardVersionDetection = SourceProvider()
|
||||||
|
.getSource(app!.app.url, overrideSource: app.app.overrideSource)
|
||||||
|
.naiveStandardVersionDetection;
|
||||||
|
return app.app.additionalSettings['trackOnly'] != true &&
|
||||||
|
app.app.additionalSettings['versionDetection'] !=
|
||||||
'releaseDateAsVersion' &&
|
'releaseDateAsVersion' &&
|
||||||
app?.installedInfo?.versionName != null &&
|
app.installedInfo?.versionName != null &&
|
||||||
app?.app.installedVersion != null &&
|
app.app.installedVersion != null &&
|
||||||
reconcileVersionDifferences(
|
(reconcileVersionDifferences(app.installedInfo!.versionName!,
|
||||||
app!.installedInfo!.versionName!, app.app.installedVersion!) !=
|
app.app.installedVersion!) !=
|
||||||
null;
|
null ||
|
||||||
|
naiveStandardVersionDetection);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Given an App and it's on-device info...
|
// Given an App and it's on-device info...
|
||||||
@@ -725,8 +732,13 @@ class AppsProvider with ChangeNotifier {
|
|||||||
App app, PackageInfo? installedInfo) {
|
App app, PackageInfo? installedInfo) {
|
||||||
var modded = false;
|
var modded = false;
|
||||||
var trackOnly = app.additionalSettings['trackOnly'] == true;
|
var trackOnly = app.additionalSettings['trackOnly'] == true;
|
||||||
var noVersionDetection = app.additionalSettings['versionDetection'] !=
|
var versionDetectionIsStandard =
|
||||||
|
app.additionalSettings['versionDetection'] ==
|
||||||
'standardVersionDetection';
|
'standardVersionDetection';
|
||||||
|
var naiveStandardVersionDetection = SourceProvider()
|
||||||
|
.getSource(app.url, overrideSource: app.overrideSource)
|
||||||
|
.naiveStandardVersionDetection;
|
||||||
|
;
|
||||||
// FIRST, COMPARE THE APP'S REPORTED AND REAL INSTALLED VERSIONS, WHERE ONE IS NULL
|
// FIRST, COMPARE THE APP'S REPORTED AND REAL INSTALLED VERSIONS, WHERE ONE IS NULL
|
||||||
if (installedInfo == null && app.installedVersion != null && !trackOnly) {
|
if (installedInfo == null && app.installedVersion != null && !trackOnly) {
|
||||||
// App says it's installed but isn't really (and isn't track only) - set to not installed
|
// App says it's installed but isn't really (and isn't track only) - set to not installed
|
||||||
@@ -741,7 +753,7 @@ class AppsProvider with ChangeNotifier {
|
|||||||
// SECOND, RECONCILE DIFFERENCES BETWEEN THE APP'S REPORTED AND REAL INSTALLED VERSIONS, WHERE NEITHER IS NULL
|
// SECOND, RECONCILE DIFFERENCES BETWEEN THE APP'S REPORTED AND REAL INSTALLED VERSIONS, WHERE NEITHER IS NULL
|
||||||
if (installedInfo?.versionName != null &&
|
if (installedInfo?.versionName != null &&
|
||||||
installedInfo!.versionName != app.installedVersion &&
|
installedInfo!.versionName != app.installedVersion &&
|
||||||
!noVersionDetection) {
|
versionDetectionIsStandard) {
|
||||||
// App's reported version and real version don't match (and it uses standard version detection)
|
// App's reported version and real version don't match (and it uses standard version detection)
|
||||||
// If they share a standard format (and are still different under it), update the reported version accordingly
|
// If they share a standard format (and are still different under it), update the reported version accordingly
|
||||||
var correctedInstalledVersion = reconcileVersionDifferences(
|
var correctedInstalledVersion = reconcileVersionDifferences(
|
||||||
@@ -749,12 +761,15 @@ class AppsProvider with ChangeNotifier {
|
|||||||
if (correctedInstalledVersion?.key == false) {
|
if (correctedInstalledVersion?.key == false) {
|
||||||
app.installedVersion = correctedInstalledVersion!.value;
|
app.installedVersion = correctedInstalledVersion!.value;
|
||||||
modded = true;
|
modded = true;
|
||||||
|
} else if (naiveStandardVersionDetection) {
|
||||||
|
app.installedVersion = installedInfo.versionName;
|
||||||
|
modded = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// THIRD, RECONCILE THE APP'S REPORTED INSTALLED AND LATEST VERSIONS
|
// THIRD, RECONCILE THE APP'S REPORTED INSTALLED AND LATEST VERSIONS
|
||||||
if (app.installedVersion != null &&
|
if (app.installedVersion != null &&
|
||||||
app.installedVersion != app.latestVersion &&
|
app.installedVersion != app.latestVersion &&
|
||||||
!noVersionDetection) {
|
versionDetectionIsStandard) {
|
||||||
// App's reported installed and latest versions don't match (and it uses standard version detection)
|
// App's reported installed and latest versions don't match (and it uses standard version detection)
|
||||||
// If they share a standard format, make sure the App's reported installed version uses that format
|
// If they share a standard format, make sure the App's reported installed version uses that format
|
||||||
var correctedInstalledVersion =
|
var correctedInstalledVersion =
|
||||||
@@ -766,8 +781,7 @@ class AppsProvider with ChangeNotifier {
|
|||||||
}
|
}
|
||||||
// FOURTH, DISABLE VERSION DETECTION IF ENABLED AND THE REPORTED/REAL INSTALLED VERSIONS ARE NOT STANDARDIZED
|
// FOURTH, DISABLE VERSION DETECTION IF ENABLED AND THE REPORTED/REAL INSTALLED VERSIONS ARE NOT STANDARDIZED
|
||||||
if (installedInfo != null &&
|
if (installedInfo != null &&
|
||||||
app.additionalSettings['versionDetection'] ==
|
versionDetectionIsStandard &&
|
||||||
'standardVersionDetection' &&
|
|
||||||
!isVersionDetectionPossible(
|
!isVersionDetectionPossible(
|
||||||
AppInMemory(app, null, installedInfo, null))) {
|
AppInMemory(app, null, installedInfo, null))) {
|
||||||
app.additionalSettings['versionDetection'] = 'noVersionDetection';
|
app.additionalSettings['versionDetection'] = 'noVersionDetection';
|
||||||
|
@@ -328,6 +328,7 @@ abstract class AppSource {
|
|||||||
bool changeLogIfAnyIsMarkDown = true;
|
bool changeLogIfAnyIsMarkDown = true;
|
||||||
bool appIdInferIsOptional = false;
|
bool appIdInferIsOptional = false;
|
||||||
bool allowSubDomains = false;
|
bool allowSubDomains = false;
|
||||||
|
bool naiveStandardVersionDetection = false;
|
||||||
|
|
||||||
AppSource() {
|
AppSource() {
|
||||||
name = runtimeType.toString();
|
name = runtimeType.toString();
|
||||||
|
28
pubspec.lock
28
pubspec.lock
@@ -46,10 +46,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: archive
|
name: archive
|
||||||
sha256: "20071638cbe4e5964a427cfa0e86dce55d060bc7d82d56f3554095d7239a8765"
|
sha256: d4dc11707abb32ef756ab95678c0d6df54003d98277f7c9aeda14c48e7a38c2f
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.4.2"
|
version: "3.4.3"
|
||||||
args:
|
args:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -386,10 +386,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: image
|
name: image
|
||||||
sha256: "6e703d5e2f8c63fb31a77753915c1ec8baebde8088844e0d29f71b8f0b108888"
|
sha256: "028f61960d56f26414eb616b48b04eb37d700cbe477b7fb09bf1d7ce57fd9271"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "4.1.0"
|
version: "4.1.3"
|
||||||
intl:
|
intl:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -546,10 +546,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: permission_handler_android
|
name: permission_handler_android
|
||||||
sha256: f2543a236584a5e8be79076f858022f100ce690e31530e6fa4c32ac94f276d3a
|
sha256: ace7d15a3d1a4a0b91c041d01e5405df221edb9de9116525efc773c74e6fc790
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "11.0.3"
|
version: "11.0.5"
|
||||||
permission_handler_apple:
|
permission_handler_apple:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -879,18 +879,18 @@ packages:
|
|||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: webview_flutter
|
name: webview_flutter
|
||||||
sha256: "82f6787d5df55907aa01e49bd9644f4ed1cc82af7a8257dd9947815959d2e755"
|
sha256: "053d454c9475546b4382e9498601fb46293cdac9b3ca93f1a738375bc9a1eee4"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "4.2.4"
|
version: "4.3.0"
|
||||||
webview_flutter_android:
|
webview_flutter_android:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: webview_flutter_android
|
name: webview_flutter_android
|
||||||
sha256: ddc167c6676f57c8b367d19fcbee267d6dc6adf81bd6c3cb87981d30746e0a6d
|
sha256: b0cd33dd7d3dd8e5f664e11a19e17ba12c352647269921a3b568406b001f1dff
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.10.1"
|
version: "3.12.0"
|
||||||
webview_flutter_platform_interface:
|
webview_flutter_platform_interface:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -903,18 +903,18 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: webview_flutter_wkwebview
|
name: webview_flutter_wkwebview
|
||||||
sha256: "485af05f2c5f83c7f78c20e236b170ad02df7153b299ae9917345be43871d29f"
|
sha256: "3c7d56ca4b82654ad1f58aeefb8d593a59224f26d6b2bf8feed074361eb34c86"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.8.0"
|
version: "3.9.0"
|
||||||
win32:
|
win32:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: win32
|
name: win32
|
||||||
sha256: c97defd418eef4ec88c0d1652cdce84b9f7b63dd7198e266d06ac1710d527067
|
sha256: "350a11abd2d1d97e0cc7a28a81b781c08002aa2864d9e3f192ca0ffa18b06ed3"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "5.0.8"
|
version: "5.0.9"
|
||||||
win32_registry:
|
win32_registry:
|
||||||
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.19+211 # When changing this, update the tag in main() accordingly
|
version: 0.14.22+214 # When changing this, update the tag in main() accordingly
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
sdk: '>=3.0.0 <4.0.0'
|
sdk: '>=3.0.0 <4.0.0'
|
||||||
|
Reference in New Issue
Block a user