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