mirror of
https://github.com/ImranR98/Obtainium.git
synced 2025-07-13 13:26:43 +02:00
Compare commits
7 Commits
2dca74edb2
...
foreground
Author | SHA1 | Date | |
---|---|---|---|
2c6e95f902 | |||
7dbf3ac102 | |||
6055ae6a69 | |||
2223616f2a | |||
39b76a41cf | |||
377ebeeca2 | |||
c88f55af5a |
2
.flutter
2
.flutter
Submodule .flutter updated: 6fba2447e9...fcf2c11572
@ -90,7 +90,7 @@ androidComponents {
|
|||||||
onVariants { variant ->
|
onVariants { variant ->
|
||||||
variant.outputs.forEach { output ->
|
variant.outputs.forEach { output ->
|
||||||
val name = output.filters.find { it.filterType == ABI }?.identifier
|
val name = output.filters.find { it.filterType == ABI }?.identifier
|
||||||
val baseAbiCode = abiCodes[name]
|
val baseAbiCode = abiCodes[name] ?: 0
|
||||||
if (baseAbiCode != null) {
|
if (baseAbiCode != null) {
|
||||||
output.versionCode.set(baseAbiCode + ((output.versionCode.get() ?: 0) * 10))
|
output.versionCode.set(baseAbiCode + ((output.versionCode.get() ?: 0) * 10))
|
||||||
}
|
}
|
||||||
|
@ -61,6 +61,13 @@
|
|||||||
android:enabled="true"
|
android:enabled="true"
|
||||||
android:exported="true"
|
android:exported="true"
|
||||||
android:permission="android.permission.INTERACT_ACROSS_USERS_FULL" />
|
android:permission="android.permission.INTERACT_ACROSS_USERS_FULL" />
|
||||||
|
<service
|
||||||
|
android:name="com.pravera.flutter_foreground_task.service.ForegroundService"
|
||||||
|
android:foregroundServiceType="specialUse"
|
||||||
|
android:exported="false" />
|
||||||
|
<meta-data
|
||||||
|
android:name="dev.imranr.obtainium.service.NOTIFICATION_ICON"
|
||||||
|
android:resource="@drawable/ic_notification" />
|
||||||
</application>
|
</application>
|
||||||
<uses-permission android:name="android.permission.INTERNET" />
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
|
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
|
||||||
@ -74,6 +81,8 @@
|
|||||||
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
|
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
|
||||||
android:maxSdkVersion="29" />
|
android:maxSdkVersion="29" />
|
||||||
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />
|
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />
|
||||||
|
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
||||||
|
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_SPECIAL_USE" />
|
||||||
<!-- Required to query activities that can process text, see:
|
<!-- Required to query activities that can process text, see:
|
||||||
https://developer.android.com/training/package-visibility and
|
https://developer.android.com/training/package-visibility and
|
||||||
https://developer.android.com/reference/android/content/Intent#ACTION_PROCESS_TEXT.
|
https://developer.android.com/reference/android/content/Intent#ACTION_PROCESS_TEXT.
|
||||||
|
BIN
android/app/src/main/res/drawable-hdpi/ic_notification.png
Normal file
BIN
android/app/src/main/res/drawable-hdpi/ic_notification.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 965 B |
BIN
android/app/src/main/res/drawable-mdpi/ic_notification.png
Normal file
BIN
android/app/src/main/res/drawable-mdpi/ic_notification.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 843 B |
BIN
android/app/src/main/res/drawable-xhdpi/ic_notification.png
Normal file
BIN
android/app/src/main/res/drawable-xhdpi/ic_notification.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.5 KiB |
BIN
android/app/src/main/res/drawable-xxhdpi/ic_notification.png
Normal file
BIN
android/app/src/main/res/drawable-xxhdpi/ic_notification.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 2.7 KiB |
BIN
android/app/src/main/res/drawable-xxxhdpi/ic_notification.png
Normal file
BIN
android/app/src/main/res/drawable-xxxhdpi/ic_notification.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 4.0 KiB |
@ -330,6 +330,8 @@
|
|||||||
"documentationLinksNote": "The Obtainium GitHub page linked below contains links to videos, articles, discussions and other resources that will help you understand how to use the app.",
|
"documentationLinksNote": "The Obtainium GitHub page linked below contains links to videos, articles, discussions and other resources that will help you understand how to use the app.",
|
||||||
"batteryOptimizationNote": "Note that background downloads may work more reliably if you disable OS battery optimizations for Obtainium.",
|
"batteryOptimizationNote": "Note that background downloads may work more reliably if you disable OS battery optimizations for Obtainium.",
|
||||||
"fileDeletionError": "Failed to delete file (try deleting it manually then try again): \"{}\"",
|
"fileDeletionError": "Failed to delete file (try deleting it manually then try again): \"{}\"",
|
||||||
|
"foregroundService": "Obtainium foreground service",
|
||||||
|
"fgServiceNotice": "This notification is required for background update checking (it can be hidden in the OS settings)",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "Remove app?",
|
"one": "Remove app?",
|
||||||
"other": "Remove apps?"
|
"other": "Remove apps?"
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"invalidURLForSource": "Неверный URL-адрес приложения: {}",
|
"invalidURLForSource": "Неверный URL-адрес приложения: {}",
|
||||||
"noReleaseFound": "Не удалось найти подходящий релиз",
|
"noReleaseFound": "Не удалось найти подходящий выпуск",
|
||||||
"noVersionFound": "Не удалось определить версию релиза",
|
"noVersionFound": "Не удалось определить версию выпуска",
|
||||||
"urlMatchesNoSource": "URL-адрес не соответствует известному источнику",
|
"urlMatchesNoSource": "URL-адрес не соответствует известному источнику",
|
||||||
"cantInstallOlderVersion": "Невозможно установить более старую версию приложения",
|
"cantInstallOlderVersion": "Невозможно установить более старую версию приложения",
|
||||||
"appIdMismatch": "ID загруженного пакета не совпадает с существующим ID приложения",
|
"appIdMismatch": "ID загруженного пакета не совпадает с существующим ID приложения",
|
||||||
@ -9,12 +9,12 @@
|
|||||||
"placeholder": "Заполнитель",
|
"placeholder": "Заполнитель",
|
||||||
"someErrors": "Возникли некоторые ошибки",
|
"someErrors": "Возникли некоторые ошибки",
|
||||||
"unexpectedError": "Неожиданная ошибка",
|
"unexpectedError": "Неожиданная ошибка",
|
||||||
"ok": "Ок",
|
"ok": "OK",
|
||||||
"and": "и",
|
"and": "и",
|
||||||
"githubPATLabel": "Персональный токен доступа GitHub\n(увеличивает лимит запросов)",
|
"githubPATLabel": "Персональный токен доступа GitHub\n(увеличивает лимит запросов)",
|
||||||
"includePrereleases": "Включить предварительные релизы",
|
"includePrereleases": "Включать предварительные выпуски",
|
||||||
"fallbackToOlderReleases": "Откатываться к предыдущей версии",
|
"fallbackToOlderReleases": "Откатываться к предыдущей версии",
|
||||||
"filterReleaseTitlesByRegEx": "Фильтровать заголовки релизов\n(регулярное выражение)",
|
"filterReleaseTitlesByRegEx": "Фильтровать заголовки выпусков\n(регулярное выражение)",
|
||||||
"invalidRegEx": "Неверное регулярное выражение",
|
"invalidRegEx": "Неверное регулярное выражение",
|
||||||
"noDescription": "Нет описания",
|
"noDescription": "Нет описания",
|
||||||
"cancel": "Отмена",
|
"cancel": "Отмена",
|
||||||
@ -32,13 +32,13 @@
|
|||||||
"source": "Источник",
|
"source": "Источник",
|
||||||
"app": "Приложение",
|
"app": "Приложение",
|
||||||
"appsFromSourceAreTrackOnly": "Приложения из этого источника настроены только для отслеживания",
|
"appsFromSourceAreTrackOnly": "Приложения из этого источника настроены только для отслеживания",
|
||||||
"youPickedTrackOnly": "Вы выбрали опцию 'Только для отслеживания'",
|
"youPickedTrackOnly": "Выбрана настройка «только для отслеживания»",
|
||||||
"trackOnlyAppDescription": "Приложение будет отслеживаться на предмет обновлений, но Obtainium не сможет загрузить или установить его",
|
"trackOnlyAppDescription": "Приложение будет отслеживаться на предмет обновлений, но Obtainium не сможет загрузить или установить его",
|
||||||
"cancelled": "Отменено",
|
"cancelled": "Отменено",
|
||||||
"appAlreadyAdded": "Приложение уже добавлено",
|
"appAlreadyAdded": "Приложение уже добавлено",
|
||||||
"alreadyUpToDateQuestion": "Приложение уже обновлено?",
|
"alreadyUpToDateQuestion": "Приложение уже обновлено?",
|
||||||
"addApp": "Добавить",
|
"addApp": "Добавить",
|
||||||
"appSourceURL": "URL-источник приложения",
|
"appSourceURL": "URL-адрес источника приложения",
|
||||||
"error": "Ошибка",
|
"error": "Ошибка",
|
||||||
"add": "Добавить",
|
"add": "Добавить",
|
||||||
"searchSomeSourcesLabel": "Поиск (в некоторых источниках)",
|
"searchSomeSourcesLabel": "Поиск (в некоторых источниках)",
|
||||||
@ -63,10 +63,10 @@
|
|||||||
"removeSelectedApps": "Удалить выбранные приложения",
|
"removeSelectedApps": "Удалить выбранные приложения",
|
||||||
"updateX": "Обновить {}",
|
"updateX": "Обновить {}",
|
||||||
"installX": "Установить {}",
|
"installX": "Установить {}",
|
||||||
"markXTrackOnlyAsUpdated": "Отметить {}\n(Только для отслеживания)\nкак обновленное",
|
"markXTrackOnlyAsUpdated": "Отметить {}\n(только для отслеживания)\nкак обновлённое",
|
||||||
"changeX": "Изменить {}",
|
"changeX": "Изменить {}",
|
||||||
"installUpdateApps": "Установить/Обновить приложения",
|
"installUpdateApps": "Установить/обновить приложения",
|
||||||
"installUpdateSelectedApps": "Установить/Обновить выбранные приложения",
|
"installUpdateSelectedApps": "Установить/обновить выбранные приложения",
|
||||||
"markXSelectedAppsAsUpdated": "Выбрано приложений: {}. Отметить как обновлённые?",
|
"markXSelectedAppsAsUpdated": "Выбрано приложений: {}. Отметить как обновлённые?",
|
||||||
"no": "Нет",
|
"no": "Нет",
|
||||||
"yes": "Да",
|
"yes": "Да",
|
||||||
@ -74,10 +74,10 @@
|
|||||||
"pinToTop": "Закрепить сверху",
|
"pinToTop": "Закрепить сверху",
|
||||||
"unpinFromTop": "Открепить",
|
"unpinFromTop": "Открепить",
|
||||||
"resetInstallStatusForSelectedAppsQuestion": "Сбросить статус установки для выбранных приложений?",
|
"resetInstallStatusForSelectedAppsQuestion": "Сбросить статус установки для выбранных приложений?",
|
||||||
"installStatusOfXWillBeResetExplanation": "Статус установки для выбранных приложений будет сброшен.\n\nЭто может помочь, если версия приложения, отображаемая в Obtainium, некорректная — из-за неудачных обновлений или других проблем",
|
"installStatusOfXWillBeResetExplanation": "Статус установки для выбранных приложений будет сброшен.\n\nЭто может помочь, если версия приложения, отображаемая в Obtainium, некорректная (из-за неудачных обновлений или других проблем).",
|
||||||
"customLinkMessage": "Эти ссылки работают на устройствах с установленным Obtainium",
|
"customLinkMessage": "Эти ссылки работают на устройствах с установленным Obtainium",
|
||||||
"shareAppConfigLinks": "Поделиться конфигурацией приложения в виде HTML-ссылки",
|
"shareAppConfigLinks": "Поделиться конфигурацией приложения в виде HTML-ссылки",
|
||||||
"shareSelectedAppURLs": "Поделиться выбранными URL-адресами приложений",
|
"shareSelectedAppURLs": "Поделиться URL-адресами выбранных приложений",
|
||||||
"resetInstallStatus": "Сбросить статус установки",
|
"resetInstallStatus": "Сбросить статус установки",
|
||||||
"more": "Ещё",
|
"more": "Ещё",
|
||||||
"removeOutdatedFilter": "Удалить фильтр для устаревших приложений",
|
"removeOutdatedFilter": "Удалить фильтр для устаревших приложений",
|
||||||
@ -86,7 +86,7 @@
|
|||||||
"filterApps": "Фильтровать приложения",
|
"filterApps": "Фильтровать приложения",
|
||||||
"appName": "Название приложения",
|
"appName": "Название приложения",
|
||||||
"author": "Автор",
|
"author": "Автор",
|
||||||
"upToDateApps": "Приложения со свежими обновлениями",
|
"upToDateApps": "Приложения с обновлениями",
|
||||||
"nonInstalledApps": "Неустановленные приложения",
|
"nonInstalledApps": "Неустановленные приложения",
|
||||||
"importExport": "Данные",
|
"importExport": "Данные",
|
||||||
"settings": "Настройки",
|
"settings": "Настройки",
|
||||||
@ -97,12 +97,12 @@
|
|||||||
"obtainiumImport": "Импорт в Obtainium",
|
"obtainiumImport": "Импорт в Obtainium",
|
||||||
"importFromURLList": "Импорт из списка URL-адресов",
|
"importFromURLList": "Импорт из списка URL-адресов",
|
||||||
"searchQuery": "Поисковый запрос",
|
"searchQuery": "Поисковый запрос",
|
||||||
"appURLList": "Список URL приложений",
|
"appURLList": "Список URL-адресов приложений",
|
||||||
"line": "Строка",
|
"line": "Строка",
|
||||||
"searchX": "Поиск {}",
|
"searchX": "Поиск {}",
|
||||||
"noResults": "Результатов не найдено",
|
"noResults": "Ничего не найдено",
|
||||||
"importX": "Импорт {}",
|
"importX": "Импорт {}",
|
||||||
"importedAppsIdDisclaimer": "Импортированные приложения могут неверно отображаться как неустановленные.\nДля исправления этой проблемы повторно установите их через Obtainium.\nЭто не должно повлиять на данные приложения.\n\nПроблемы возникают только при импорте из URL-адреса и сторонних источников",
|
"importedAppsIdDisclaimer": "Импортированные приложения могут неверно отображаться как неустановленные.\nДля исправления этой проблемы повторно установите их через Obtainium.\nЭто не должно повлиять на данные приложения.\n\nПроблемы возникают только при импорте из URL-адреса и сторонних источников.",
|
||||||
"importErrors": "Ошибка импорта",
|
"importErrors": "Ошибка импорта",
|
||||||
"importedXOfYApps": "Импортировано приложений: {} из {}",
|
"importedXOfYApps": "Импортировано приложений: {} из {}",
|
||||||
"followingURLsHadErrors": "При импорте следующие URL-адреса содержали ошибки:",
|
"followingURLsHadErrors": "При импорте следующие URL-адреса содержали ошибки:",
|
||||||
@ -112,12 +112,12 @@
|
|||||||
"theme": "Тема",
|
"theme": "Тема",
|
||||||
"dark": "Тёмная",
|
"dark": "Тёмная",
|
||||||
"light": "Светлая",
|
"light": "Светлая",
|
||||||
"followSystem": "Системная",
|
"followSystem": "Как в системе",
|
||||||
"followSystemThemeExplanation": "Следование системной теме возможно только при использовании сторонних приложений",
|
"followSystemThemeExplanation": "Следование системной теме возможно только при использовании сторонних приложений",
|
||||||
"useBlackTheme": "Использовать чёрную тему",
|
"useBlackTheme": "Использовать чёрную тему",
|
||||||
"appSortBy": "Сортировка приложений",
|
"appSortBy": "Сортировка приложений",
|
||||||
"authorName": "Автор/Название",
|
"authorName": "Автор/название",
|
||||||
"nameAuthor": "Название/Автор",
|
"nameAuthor": "Название/автор",
|
||||||
"asAdded": "В порядке добавления",
|
"asAdded": "В порядке добавления",
|
||||||
"appSortOrder": "Порядок",
|
"appSortOrder": "Порядок",
|
||||||
"ascending": "По возрастанию",
|
"ascending": "По возрастанию",
|
||||||
@ -126,12 +126,12 @@
|
|||||||
"neverManualOnly": "Никогда — только вручную",
|
"neverManualOnly": "Никогда — только вручную",
|
||||||
"appearance": "Внешний вид",
|
"appearance": "Внешний вид",
|
||||||
"showWebInAppView": "Показывать исходную веб-страницу на странице приложения",
|
"showWebInAppView": "Показывать исходную веб-страницу на странице приложения",
|
||||||
"pinUpdates": "Отображать обновления приложений сверху списка",
|
"pinUpdates": "Показывать обновления приложений сверху списка",
|
||||||
"updates": "Обновления",
|
"updates": "Обновления",
|
||||||
"sourceSpecific": "Настройки источников",
|
"sourceSpecific": "Настройки источников",
|
||||||
"appSource": "Источник",
|
"appSource": "Источник",
|
||||||
"noLogs": "Нет журналов",
|
"noLogs": "Нет журналов",
|
||||||
"appLogs": "Логи",
|
"appLogs": "Журналы",
|
||||||
"close": "Закрыть",
|
"close": "Закрыть",
|
||||||
"share": "Поделиться",
|
"share": "Поделиться",
|
||||||
"appNotFound": "Приложение не найдено",
|
"appNotFound": "Приложение не найдено",
|
||||||
@ -141,21 +141,21 @@
|
|||||||
"deviceSupportsXArch": "Ваше устройство поддерживает архитектуру процессора {}",
|
"deviceSupportsXArch": "Ваше устройство поддерживает архитектуру процессора {}",
|
||||||
"deviceSupportsFollowingArchs": "Ваше устройство поддерживает следующие архитектуры процессора:",
|
"deviceSupportsFollowingArchs": "Ваше устройство поддерживает следующие архитектуры процессора:",
|
||||||
"warning": "Предупреждение",
|
"warning": "Предупреждение",
|
||||||
"sourceIsXButPackageFromYPrompt": "Источник приложения — '{}', но пакет для установки получен из '{}'. Продолжить?",
|
"sourceIsXButPackageFromYPrompt": "Источник приложения — «{}», но пакет для установки получен из «{}». Продолжить?",
|
||||||
"updatesAvailable": "Доступны обновления",
|
"updatesAvailable": "Доступны обновления",
|
||||||
"updatesAvailableNotifDescription": "Уведомляет о наличии обновлений для одного или нескольких приложений в Obtainium",
|
"updatesAvailableNotifDescription": "Уведомляет о наличии обновлений для одного или нескольких приложений в Obtainium",
|
||||||
"noNewUpdates": "Нет новых обновлений",
|
"noNewUpdates": "Нет обновлений",
|
||||||
"xHasAnUpdate": "{} есть обновление",
|
"xHasAnUpdate": "Для {} есть обновление",
|
||||||
"appsUpdated": "Приложения обновлены",
|
"appsUpdated": "Приложения обновлены",
|
||||||
"appsNotUpdated": "Не удалось обновить приложения",
|
"appsNotUpdated": "Не удалось обновить приложения",
|
||||||
"appsUpdatedNotifDescription": "Уведомляет об обновлении одного или нескольких приложений в фоновом режиме",
|
"appsUpdatedNotifDescription": "Уведомляет об обновлении одного или нескольких приложений в фоновом режиме",
|
||||||
"xWasUpdatedToY": "{} была обновлена до версии {}",
|
"xWasUpdatedToY": "{} обновлено до версии {}",
|
||||||
"xWasNotUpdatedToY": "Не удалось обновить {} до версии {}",
|
"xWasNotUpdatedToY": "Не удалось обновить {} до версии {}",
|
||||||
"errorCheckingUpdates": "Ошибка при проверке обновлений",
|
"errorCheckingUpdates": "Ошибка при проверке обновлений",
|
||||||
"errorCheckingUpdatesNotifDescription": "Уведомление о завершении проверки обновлений в фоновом режиме с ошибкой",
|
"errorCheckingUpdatesNotifDescription": "Уведомление о завершении проверки обновлений в фоновом режиме с ошибкой",
|
||||||
"appsRemoved": "Приложение удалено",
|
"appsRemoved": "Приложение удалено",
|
||||||
"appsRemovedNotifDescription": "Уведомление об удалении одного или несколько приложений из-за ошибок при их загрузке",
|
"appsRemovedNotifDescription": "Уведомление об удалении одного или несколько приложений из-за ошибок при их загрузке",
|
||||||
"xWasRemovedDueToErrorY": "{} был удален из-за ошибки: {}",
|
"xWasRemovedDueToErrorY": "{} удалено из-за ошибки: {}",
|
||||||
"completeAppInstallation": "Завершение установки приложения",
|
"completeAppInstallation": "Завершение установки приложения",
|
||||||
"obtainiumMustBeOpenToInstallApps": "Obtainium должен быть открыт для установки приложений",
|
"obtainiumMustBeOpenToInstallApps": "Obtainium должен быть открыт для установки приложений",
|
||||||
"completeAppInstallationNotifDescription": "Уведомление о необходимости открыть Obtainium для завершения установки приложения",
|
"completeAppInstallationNotifDescription": "Уведомление о необходимости открыть Obtainium для завершения установки приложения",
|
||||||
@ -172,7 +172,7 @@
|
|||||||
"installedVersionX": "Установленная версия: {}",
|
"installedVersionX": "Установленная версия: {}",
|
||||||
"lastUpdateCheckX": "Последняя проверка: {}",
|
"lastUpdateCheckX": "Последняя проверка: {}",
|
||||||
"remove": "Удалить",
|
"remove": "Удалить",
|
||||||
"yesMarkUpdated": "Да, отметить как обновленное",
|
"yesMarkUpdated": "Да, отметить как обновлённое",
|
||||||
"fdroid": "Официальные репозитории F-Droid",
|
"fdroid": "Официальные репозитории F-Droid",
|
||||||
"appIdOrName": "ID или название приложения",
|
"appIdOrName": "ID или название приложения",
|
||||||
"appId": "ID приложения",
|
"appId": "ID приложения",
|
||||||
@ -180,39 +180,39 @@
|
|||||||
"reposHaveMultipleApps": "В хранилище несколько приложений",
|
"reposHaveMultipleApps": "В хранилище несколько приложений",
|
||||||
"fdroidThirdPartyRepo": "Сторонние репозитории F-Droid",
|
"fdroidThirdPartyRepo": "Сторонние репозитории F-Droid",
|
||||||
"install": "Установить",
|
"install": "Установить",
|
||||||
"markInstalled": "Пометить как установленное",
|
"markInstalled": "Отметить установленным",
|
||||||
"update": "Обновить",
|
"update": "Обновить",
|
||||||
"markUpdated": "Отметить обновлённым",
|
"markUpdated": "Отметить обновлённым",
|
||||||
"additionalOptions": "Дополнительные настройки",
|
"additionalOptions": "Дополнительные настройки",
|
||||||
"disableVersionDetection": "Отключить обнаружение версии",
|
"disableVersionDetection": "Отключить определение версии",
|
||||||
"noVersionDetectionExplanation": "Эта настройка должна использоваться только для приложений, где обнаружение версии не работает корректно",
|
"noVersionDetectionExplanation": "Эта настройка должна использоваться только для приложений, где определение версии не работает корректно",
|
||||||
"downloadingX": "Загрузка {}",
|
"downloadingX": "Загрузка {}",
|
||||||
"downloadX": "Скачать {}",
|
"downloadX": "Загрузить {}",
|
||||||
"downloadedX": "Загружено {}",
|
"downloadedX": "Загружено {}",
|
||||||
"releaseAsset": "Релизный объект",
|
"releaseAsset": "Объект выпуска",
|
||||||
"downloadNotifDescription": "Уведомляет пользователя о прогрессе загрузки приложения",
|
"downloadNotifDescription": "Уведомляет пользователя о прогрессе загрузки приложения",
|
||||||
"noAPKFound": "APK не найден",
|
"noAPKFound": "APK-файл не найден",
|
||||||
"noVersionDetection": "Обнаружение версий отключено",
|
"noVersionDetection": "Определение версий отключено",
|
||||||
"categorize": "Категоризировать",
|
"categorize": "Категоризировать",
|
||||||
"categories": "Категории",
|
"categories": "Категории",
|
||||||
"category": "Категория",
|
"category": "Категория",
|
||||||
"noCategory": "Без категории",
|
"noCategory": "Без категории",
|
||||||
"noCategories": "Без категорий",
|
"noCategories": "Без категорий",
|
||||||
"deleteCategoriesQuestion": "Удалить категории?",
|
"deleteCategoriesQuestion": "Удалить категории?",
|
||||||
"categoryDeleteWarning": "Все приложения в удаленных категориях будут помечены как без категории",
|
"categoryDeleteWarning": "Все приложения в удалённых категориях будут помечены как «без категории»",
|
||||||
"addCategory": "Добавить категорию",
|
"addCategory": "Добавить категорию",
|
||||||
"label": "Метка",
|
"label": "Метка",
|
||||||
"language": "Язык",
|
"language": "Язык",
|
||||||
"copiedToClipboard": "Скопировано в буфер обмена",
|
"copiedToClipboard": "Скопировано в буфер обмена",
|
||||||
"storagePermissionDenied": "Отказано в доступе к хранилищу",
|
"storagePermissionDenied": "Отказано в доступе к хранилищу",
|
||||||
"selectedCategorizeWarning": "Это заменит все текущие настройки категорий для выбранных приложений",
|
"selectedCategorizeWarning": "Это заменит все текущие настройки категорий для выбранных приложений",
|
||||||
"filterAPKsByRegEx": "Отфильтровать APK-файлы\n(регулярное выражение)",
|
"filterAPKsByRegEx": "Фильтровать APK-файлы\n(регулярное выражение)",
|
||||||
"removeFromObtainium": "Удалить из Obtainium",
|
"removeFromObtainium": "Удалить из Obtainium",
|
||||||
"uninstallFromDevice": "Удалить с устройства",
|
"uninstallFromDevice": "Удалить с устройства",
|
||||||
"onlyWorksWithNonVersionDetectApps": "Работает только для приложений с отключенным определением версии",
|
"onlyWorksWithNonVersionDetectApps": "Работает только для приложений с отключённым определением версии",
|
||||||
"releaseDateAsVersion": "Дата выпуска вместо версии",
|
"releaseDateAsVersion": "Использовать дату выпуска в качестве версии",
|
||||||
"releaseTitleAsVersion": "Используйте название релиза в качестве строки версии",
|
"releaseTitleAsVersion": "Использовать название выпуска в качестве версии",
|
||||||
"releaseDateAsVersionExplanation": "Этот параметр следует использовать только для приложений, в которых определение версии не работает правильно, но имеется дата выпуска",
|
"releaseDateAsVersionExplanation": "Эта настройка должна использоваться только для приложений, в которых определение версии не работает правильно, но имеется дата выпуска",
|
||||||
"changes": "Изменения",
|
"changes": "Изменения",
|
||||||
"releaseDate": "Дата выпуска",
|
"releaseDate": "Дата выпуска",
|
||||||
"importFromURLsInFile": "Импорт из файла URL-адресов (например: OPML)",
|
"importFromURLsInFile": "Импорт из файла URL-адресов (например: OPML)",
|
||||||
@ -220,56 +220,56 @@
|
|||||||
"versionDetection": "Определение версии",
|
"versionDetection": "Определение версии",
|
||||||
"standardVersionDetection": "Стандартное",
|
"standardVersionDetection": "Стандартное",
|
||||||
"groupByCategory": "Группировать по категориям",
|
"groupByCategory": "Группировать по категориям",
|
||||||
"autoApkFilterByArch": "Попытаться отфильтровать APK-файлы по архитектуре процессора",
|
"autoApkFilterByArch": "Пытаться фильтровать APK по архитектуре процессора",
|
||||||
"autoLinkFilterByArch": "Попытайтесь отфильтровать ссылки по архитектуре процессора, если это возможно",
|
"autoLinkFilterByArch": "Пытаться фильтровать ссылки по архитектуре процессора, если это возможно",
|
||||||
"overrideSource": "Переопределить источник",
|
"overrideSource": "Переопределить источник",
|
||||||
"dontShowAgain": "Не показывать снова",
|
"dontShowAgain": "Не показывать снова",
|
||||||
"dontShowTrackOnlyWarnings": "Не показывать предупреждения о только отслеживаемых приложениях",
|
"dontShowTrackOnlyWarnings": "Не показывать предупреждения о только отслеживаемых приложениях",
|
||||||
"dontShowAPKOriginWarnings": "Не показывать предупреждения об отличающемся источнике APK-файлов",
|
"dontShowAPKOriginWarnings": "Не показывать предупреждения об отличающемся источнике APK-файлов",
|
||||||
"moveNonInstalledAppsToBottom": "Отображать неустановленные приложения внизу списка",
|
"moveNonInstalledAppsToBottom": "Показывать неустановленные приложения внизу списка",
|
||||||
"gitlabPATLabel": "Персональный токен доступа GitLab",
|
"gitlabPATLabel": "Персональный токен доступа GitLab",
|
||||||
"about": "Описание",
|
"about": "Описание",
|
||||||
"requiresCredentialsInSettings": "{}: Для этого требуются дополнительные учетные данные (в настройках)",
|
"requiresCredentialsInSettings": "{}: для этого требуются дополнительные учётные данные (в настройках)",
|
||||||
"checkOnStart": "Проверять наличие обновлений при запуске",
|
"checkOnStart": "Проверять наличие обновлений при запуске",
|
||||||
"tryInferAppIdFromCode": "Попытаться определить ID приложения из исходного кода",
|
"tryInferAppIdFromCode": "Пытаться определить ID приложения из исходного кода",
|
||||||
"removeOnExternalUninstall": "Автоматически убирать из списка удаленные извне приложения",
|
"removeOnExternalUninstall": "Автоматически убирать из списка удалённые извне приложения",
|
||||||
"pickHighestVersionCode": "Автовыбор актуальной версии кода APK",
|
"pickHighestVersionCode": "Автовыбор актуальной версии кода APK",
|
||||||
"checkUpdateOnDetailPage": "Проверять наличие обновлений при открытии страницы приложения",
|
"checkUpdateOnDetailPage": "Проверять наличие обновлений при открытии страницы приложения",
|
||||||
"disablePageTransitions": "Отключить анимацию перехода между страницами",
|
"disablePageTransitions": "Отключить анимацию перехода между страницами",
|
||||||
"reversePageTransitions": "Реверс анимации перехода между страницами",
|
"reversePageTransitions": "Реверс анимации перехода между страницами",
|
||||||
"minStarCount": "Минимальное количество звёзд",
|
"minStarCount": "Минимальное количество звёзд",
|
||||||
"addInfoBelow": "Добавьте эту информацию ниже",
|
"addInfoBelow": "Добавьте эту информацию ниже",
|
||||||
"addInfoInSettings": "Добавьте эту информацию в Настройки",
|
"addInfoInSettings": "Добавьте эту информацию в «Настройки»",
|
||||||
"githubSourceNote": "Используя ключ API можно обойти лимит запросов GitHub",
|
"githubSourceNote": "Используя ключ API, можно обойти ограничение запросов GitHub",
|
||||||
"sortByLastLinkSegment": "Сортировать только по последнему сегменту ссылки",
|
"sortByLastLinkSegment": "Сортировать только по последнему сегменту ссылки",
|
||||||
"filterReleaseNotesByRegEx": "Фильтровать примечания к выпуску\n(регулярное выражение)",
|
"filterReleaseNotesByRegEx": "Фильтровать примечания к выпуску\n(регулярное выражение)",
|
||||||
"customLinkFilterRegex": "Пользовательский фильтр ссылок APK\n(регулярное выражение, по умолчанию: '.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": "Фильтр для «промежуточной» ссылки для посещения",
|
||||||
"filterByLinkText": "Фильтрация ссылок по тексту ссылки",
|
"filterByLinkText": "Фильтрация ссылок по тексту ссылки",
|
||||||
"intermediateLinkNotFound": "Промежуточная ссылка не найдена",
|
"intermediateLinkNotFound": "Промежуточная ссылка не найдена",
|
||||||
"intermediateLink": "Промежуточная ссылка",
|
"intermediateLink": "Промежуточная ссылка",
|
||||||
"exemptFromBackgroundUpdates": "Исключить из фоновых обновлений (если включено)",
|
"exemptFromBackgroundUpdates": "Исключить из фоновых обновлений (если включено)",
|
||||||
"bgUpdatesOnWiFiOnly": "Отключить фоновые обновления, если нет соединения с Wi-Fi",
|
"bgUpdatesOnWiFiOnly": "Отключить фоновые обновления, если нет подключения к Wi-Fi",
|
||||||
"bgUpdatesWhileChargingOnly": "Отключение фоновых обновлений при отсутствии зарядки",
|
"bgUpdatesWhileChargingOnly": "Отключить фоновые обновления, если не идёт зарядка",
|
||||||
"autoSelectHighestVersionCode": "Автоматически выбирать APK с актуальной версией кода",
|
"autoSelectHighestVersionCode": "Автовыбор APK с актуальной версией кода",
|
||||||
"versionExtractionRegEx": "Регулярное выражение для извлечения версии",
|
"versionExtractionRegEx": "Извлечение версии\n(регулярное выражение)",
|
||||||
"trimVersionString": "Обрезка строки версии с помощью RegEx",
|
"trimVersionString": "Обрезка строки версии\n(регулярное выражение)",
|
||||||
"matchGroupToUseForX": "Группа соответствия, которую следует использовать для \"{}\"",
|
"matchGroupToUseForX": "Группа соответствия для «{}»",
|
||||||
"matchGroupToUse": "Выберите группу для использования",
|
"matchGroupToUse": "Выбрать группу соответствия",
|
||||||
"highlightTouchTargets": "Выделить менее очевидные элементы управления касанием",
|
"highlightTouchTargets": "Выделять менее очевидные элементы управления касанием",
|
||||||
"pickExportDir": "Выбрать каталог для экспорта",
|
"pickExportDir": "Выбрать каталог для экспорта",
|
||||||
"autoExportOnChanges": "Автоэкспорт при изменениях",
|
"autoExportOnChanges": "Автоэкспорт при изменениях",
|
||||||
"includeSettings": "Включить настройки",
|
"includeSettings": "Включить настройки",
|
||||||
"filterVersionsByRegEx": "Фильтровать версии по регулярному выражению",
|
"filterVersionsByRegEx": "Фильтровать версии по регулярному выражению",
|
||||||
"trySelectingSuggestedVersionCode": "Попробуйте выбрать предложенный код версии APK",
|
"trySelectingSuggestedVersionCode": "Пробовать выбрать предложенный код версии APK",
|
||||||
"dontSortReleasesList": "Сохранить порядок релизов от API",
|
"dontSortReleasesList": "Сохранить порядок выпусков от API",
|
||||||
"reverseSort": "Обратная сортировка",
|
"reverseSort": "Обратная сортировка",
|
||||||
"takeFirstLink": "Взять первую ссылку",
|
"takeFirstLink": "Взять первую ссылку",
|
||||||
"skipSort": "Пропустить сортировку",
|
"skipSort": "Пропустить сортировку",
|
||||||
@ -290,18 +290,18 @@
|
|||||||
"onlyCheckInstalledOrTrackOnlyApps": "Проверять обновления только у установленных или отслеживаемых приложений",
|
"onlyCheckInstalledOrTrackOnlyApps": "Проверять обновления только у установленных или отслеживаемых приложений",
|
||||||
"supportFixedAPKURL": "Поддержка фиксированных URL-адресов APK",
|
"supportFixedAPKURL": "Поддержка фиксированных URL-адресов APK",
|
||||||
"selectX": "Выбрать {}",
|
"selectX": "Выбрать {}",
|
||||||
"parallelDownloads": "Разрешить параллельные загрузки",
|
"parallelDownloads": "Использовать параллельные загрузки",
|
||||||
"useShizuku": "Использовать Shizuku или Sui для установки",
|
"useShizuku": "Использовать Shizuku или Sui для установки",
|
||||||
"shizukuBinderNotFound": "Совместимый сервис Shizuku не найден, возможно он не запущен",
|
"shizukuBinderNotFound": "Совместимый сервис Shizuku не найден, возможно он не запущен",
|
||||||
"shizukuOld": "Устаревшая версия Shizuku (<11), обновите",
|
"shizukuOld": "Устаревшая версия Shizuku (<11), обновите",
|
||||||
"shizukuOldAndroidWithADB": "Shizuku работает на Android < 8.1 с ADB, обновите Android или используйте Sui",
|
"shizukuOldAndroidWithADB": "Shizuku работает на Android < 8.1 с ADB, обновите Android или используйте Sui",
|
||||||
"shizukuPretendToBeGooglePlay": "Указать Google Play как источник установки (если используется Shizuku)",
|
"shizukuPretendToBeGooglePlay": "Указывать Google Play как источник установки (если используется Shizuku)",
|
||||||
"useSystemFont": "Использовать системный шрифт",
|
"useSystemFont": "Использовать системный шрифт",
|
||||||
"useVersionCodeAsOSVersion": "Использовать код версии приложения как версию, обнаруженную ОС",
|
"useVersionCodeAsOSVersion": "Использовать код версии приложения как версию, обнаруженную ОС",
|
||||||
"requestHeader": "Заголовок запроса",
|
"requestHeader": "Заголовок запроса",
|
||||||
"useLatestAssetDateAsReleaseDate": "Использовать последнюю загрузку ресурса в качестве даты выпуска",
|
"useLatestAssetDateAsReleaseDate": "Использовать последнюю загрузку объекта в качестве даты выпуска",
|
||||||
"defaultPseudoVersioningMethod": "Метод псевдоверсионирования по умолчанию",
|
"defaultPseudoVersioningMethod": "Метод псевдоверсионирования по умолчанию",
|
||||||
"partialAPKHash": "Частичный хэш APK",
|
"partialAPKHash": "Частичный хеш APK",
|
||||||
"APKLinkHash": "Хеш ссылки APK",
|
"APKLinkHash": "Хеш ссылки APK",
|
||||||
"directAPKLink": "Прямая ссылка на APK",
|
"directAPKLink": "Прямая ссылка на APK",
|
||||||
"pseudoVersionInUse": "Используется псевдоверсия",
|
"pseudoVersionInUse": "Используется псевдоверсия",
|
||||||
@ -309,17 +309,17 @@
|
|||||||
"latest": "Последний",
|
"latest": "Последний",
|
||||||
"invertRegEx": "Инвертировать регулярное выражение",
|
"invertRegEx": "Инвертировать регулярное выражение",
|
||||||
"note": "Примечание",
|
"note": "Примечание",
|
||||||
"selfHostedNote": "Выпадающий список \"{}\" можно использовать для доступа к самостоятельно размещенным/настроенным экземплярам любого источника.",
|
"selfHostedNote": "Выпадающий список «{}» можно использовать для доступа к самостоятельно размещённым/настроенным экземплярам любого источника.",
|
||||||
"badDownload": "APK не удалось разобрать (несовместимая или неполная загрузка)",
|
"badDownload": "Не удалось разобрать APK (несовместимая или неполная загрузка)",
|
||||||
"beforeNewInstallsShareToAppVerifier": "Поделитесь новыми приложениями с AppVerifier (если доступно)",
|
"beforeNewInstallsShareToAppVerifier": "Делиться новыми приложениями с AppVerifier (если доступно)",
|
||||||
"appVerifierInstructionToast": "Поделитесь с AppVerifier, а затем вернитесь сюда, когда будете готовы.",
|
"appVerifierInstructionToast": "Поделитесь с AppVerifier, а затем вернитесь сюда, когда будете готовы.",
|
||||||
"wiki": "Помощь/Вики",
|
"wiki": "Помощь/Вики",
|
||||||
"crowdsourcedConfigsLabel": "Конфигурации приложений на основе краудсорсинга (используйте на свой страх и риск)",
|
"crowdsourcedConfigsLabel": "Конфигурации приложений на основе краудсорсинга (используйте на свой страх и риск)",
|
||||||
"crowdsourcedConfigsShort": "Конфиги приложений с помощью краудсорсинга",
|
"crowdsourcedConfigsShort": "Краудсорсинг конфигураций приложений",
|
||||||
"allowInsecure": "Разрешить небезопасные HTTP-запросы",
|
"allowInsecure": "Разрешить небезопасные HTTP-запросы",
|
||||||
"stayOneVersionBehind": "Не отставайте от последней версии",
|
"stayOneVersionBehind": "Оставаться на одну версию ниже последней",
|
||||||
"useFirstApkOfVersion": "Автоматический выбор первого из нескольких APK",
|
"useFirstApkOfVersion": "Автовыбор первого из нескольких APK",
|
||||||
"refreshBeforeDownload": "Обновляйте информацию о приложении перед загрузкой",
|
"refreshBeforeDownload": "Обновлять информацию о приложении перед загрузкой",
|
||||||
"tencentAppStore": "Tencent App Store",
|
"tencentAppStore": "Tencent App Store",
|
||||||
"coolApk": "CoolApk",
|
"coolApk": "CoolApk",
|
||||||
"vivoAppStore": "vivo App Store (CN)",
|
"vivoAppStore": "vivo App Store (CN)",
|
||||||
@ -327,67 +327,80 @@
|
|||||||
"smartname": "Имя (умное)",
|
"smartname": "Имя (умное)",
|
||||||
"sortMethod": "Метод сортировки",
|
"sortMethod": "Метод сортировки",
|
||||||
"welcome": "Добро пожаловать",
|
"welcome": "Добро пожаловать",
|
||||||
"documentationLinksNote": "На странице Obtainium GitHub, ссылка на которую приведена ниже, содержатся ссылки на видео, статьи, обсуждения и другие ресурсы, которые помогут вам понять, как пользоваться приложением.",
|
"documentationLinksNote": "На странице Obtainium в GitHub, ссылка на которую приведена ниже, содержатся ссылки на видео, статьи, обсуждения и другие ресурсы, которые помогут вам понять, как пользоваться приложением.",
|
||||||
"batteryOptimizationNote": "Обратите внимание, что фоновая загрузка может работать более надежно, если отключить оптимизацию батареи ОС для Obtainium.",
|
"batteryOptimizationNote": "Обратите внимание, что фоновая загрузка может работать более надёжно, если отключить оптимизацию батареи ОС для Obtainium.",
|
||||||
"fileDeletionError": "Не удалось удалить файл (попробуйте удалить его вручную, а затем повторите попытку): \"{}\"",
|
"fileDeletionError": "Не удалось удалить файл (попробуйте удалить его вручную, а затем повторите попытку): «{}»",
|
||||||
"removeAppQuestion": {
|
"removeAppQuestion": {
|
||||||
"one": "Удалить приложение?",
|
"one": "Удалить приложение?",
|
||||||
"other": "Удалить приложения?"
|
"other": "Удалить приложения?"
|
||||||
},
|
},
|
||||||
"tooManyRequestsTryAgainInMinutes": {
|
"tooManyRequestsTryAgainInMinutes": {
|
||||||
"one": "Слишком много запросов (ограничение скорости) — попробуйте снова через {} минуту",
|
"one": "Слишком много запросов (ограничение скорости) — попробуйте снова через {} минуту",
|
||||||
"other": "Слишком много запросов (ограничение скорости) — попробуйте снова через {} минуты"
|
"few": "Слишком много запросов (ограничение скорости) — попробуйте снова через {} минуты",
|
||||||
|
"other": "Слишком много запросов (ограничение скорости) — попробуйте снова через {} минут"
|
||||||
},
|
},
|
||||||
"bgUpdateGotErrorRetryInMinutes": {
|
"bgUpdateGotErrorRetryInMinutes": {
|
||||||
"one": "При проверке обновлений в фоновом режиме возникла ошибка {}, повторная проверка будет запланирована через {} минуту",
|
"one": "При проверке обновлений в фоновом режиме возникла ошибка {}, повторная проверка будет через {} минуту",
|
||||||
"other": "При проверке обновлений в фоновом режиме возникла ошибка {}, повторная проверка будет запланирована через {} минуты"
|
"few": "При проверке обновлений в фоновом режиме возникла ошибка {}, повторная проверка будет через {} минуты",
|
||||||
|
"other": "При проверке обновлений в фоновом режиме возникла ошибка {}, повторная проверка будет через {} минут"
|
||||||
},
|
},
|
||||||
"bgCheckFoundUpdatesWillNotifyIfNeeded": {
|
"bgCheckFoundUpdatesWillNotifyIfNeeded": {
|
||||||
"one": "В ходе проверки обновления в фоновом режиме было обнаружено {} обновление — Пользователю будет отправлено уведомление, если это необходимо",
|
"one": "При проверке в фоновом режиме было обнаружено {} обновление — пользователь будет уведомлен по необходимости",
|
||||||
"other": "В ходе проверки обновления в фоновом режиме было обнаружено {} обновлений — Пользователю будет отправлено уведомление, если это необходимо"
|
"one": "При проверке в фоновом режиме было обнаружено {} обновления — пользователь будет уведомлен по необходимости",
|
||||||
|
"other": "При проверке в фоновом режиме было обнаружено {} обновлений — пользователь будет уведомлен по необходимости"
|
||||||
},
|
},
|
||||||
"apps": {
|
"apps": {
|
||||||
"one": "{} приложение",
|
"one": "{} приложение",
|
||||||
|
"few": "{} приложения",
|
||||||
"other": "{} приложений"
|
"other": "{} приложений"
|
||||||
},
|
},
|
||||||
"url": {
|
"url": {
|
||||||
"one": "{} URL-адрес",
|
"one": "{} URL-адрес",
|
||||||
"other": "{} URL-адреса"
|
"few": "{} URL-адреса",
|
||||||
|
"other": "{} URL-адресов"
|
||||||
},
|
},
|
||||||
"minute": {
|
"minute": {
|
||||||
"one": "{} минута",
|
"one": "{} минута",
|
||||||
"other": "{} минуты"
|
"few": "{} минуты",
|
||||||
|
"other": "{} минут"
|
||||||
},
|
},
|
||||||
"hour": {
|
"hour": {
|
||||||
"one": "{} час",
|
"one": "{} час",
|
||||||
|
"few": "{} часа",
|
||||||
"other": "{} часов"
|
"other": "{} часов"
|
||||||
},
|
},
|
||||||
"day": {
|
"day": {
|
||||||
"one": "{} день",
|
"one": "{} день",
|
||||||
|
"few": "{} дня",
|
||||||
"other": "{} дней"
|
"other": "{} дней"
|
||||||
},
|
},
|
||||||
"clearedNLogsBeforeXAfterY": {
|
"clearedNLogsBeforeXAfterY": {
|
||||||
"one": "Очищен {n} журнал (до = {before}, после = {after})",
|
"one": "Очищен {n} журнал (до = {before}, после = {after})",
|
||||||
|
"few": "Очищены {n} журнала (до = {before}, после = {after})",
|
||||||
"other": "Очищено {n} журналов (до = {before}, после = {after})"
|
"other": "Очищено {n} журналов (до = {before}, после = {after})"
|
||||||
},
|
},
|
||||||
"xAndNMoreUpdatesAvailable": {
|
"xAndNMoreUpdatesAvailable": {
|
||||||
"one": "У {} и еще 1 приложения есть обновление",
|
"one": "У {} и ещё 1 приложения есть обновление",
|
||||||
"other": "У {} и ещё {} приложений есть обновления"
|
"other": "У {} и ещё {} приложений есть обновления"
|
||||||
},
|
},
|
||||||
"xAndNMoreUpdatesInstalled": {
|
"xAndNMoreUpdatesInstalled": {
|
||||||
"one": "{} и ещё 1 приложение были обновлены",
|
"one": "{} и ещё 1 приложение были обновлены",
|
||||||
|
"few": "{} и ещё {} приложения были обновлены",
|
||||||
"other": "{} и ещё {} приложений были обновлены"
|
"other": "{} и ещё {} приложений были обновлены"
|
||||||
},
|
},
|
||||||
"xAndNMoreUpdatesFailed": {
|
"xAndNMoreUpdatesFailed": {
|
||||||
"one": "Не удалось обновить {} и ещё 1 приложение",
|
"one": "Не удалось обновить {} и ещё 1 приложение",
|
||||||
|
"few": "Не удалось обновить {} и ещё {} приложения",
|
||||||
"other": "Не удалось обновить {} и ещё {} приложений"
|
"other": "Не удалось обновить {} и ещё {} приложений"
|
||||||
},
|
},
|
||||||
"xAndNMoreUpdatesPossiblyInstalled": {
|
"xAndNMoreUpdatesPossiblyInstalled": {
|
||||||
"one": "{} и ещё 1 приложение могли быть обновлены",
|
"one": "{} и ещё 1 приложение могли быть обновлены",
|
||||||
|
"few": "{} и ещё {} приложения могли быть обновлены",
|
||||||
"other": "{} и ещё {} приложений могли быть обновлены"
|
"other": "{} и ещё {} приложений могли быть обновлены"
|
||||||
},
|
},
|
||||||
"apk": {
|
"apk": {
|
||||||
"one": "{} APK",
|
"one": "{} APK-файл",
|
||||||
"other": "{} APKи"
|
"few": "{} APK-файла",
|
||||||
|
"other": "{} APK-файлов"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
265
lib/main.dart
265
lib/main.dart
@ -9,16 +9,15 @@ import 'package:obtainium/providers/native_provider.dart';
|
|||||||
import 'package:obtainium/providers/notifications_provider.dart';
|
import 'package:obtainium/providers/notifications_provider.dart';
|
||||||
import 'package:obtainium/providers/settings_provider.dart';
|
import 'package:obtainium/providers/settings_provider.dart';
|
||||||
import 'package:obtainium/providers/source_provider.dart';
|
import 'package:obtainium/providers/source_provider.dart';
|
||||||
import 'package:permission_handler/permission_handler.dart';
|
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
import 'package:dynamic_color/dynamic_color.dart';
|
import 'package:dynamic_color/dynamic_color.dart';
|
||||||
import 'package:device_info_plus/device_info_plus.dart';
|
import 'package:device_info_plus/device_info_plus.dart';
|
||||||
import 'package:background_fetch/background_fetch.dart';
|
|
||||||
import 'package:easy_localization/easy_localization.dart';
|
import 'package:easy_localization/easy_localization.dart';
|
||||||
// ignore: implementation_imports
|
// ignore: implementation_imports
|
||||||
import 'package:easy_localization/src/easy_localization_controller.dart';
|
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';
|
||||||
|
import 'package:flutter_foreground_task/flutter_foreground_task.dart';
|
||||||
|
|
||||||
List<MapEntry<Locale, String>> supportedLocales = const [
|
List<MapEntry<Locale, String>> supportedLocales = const [
|
||||||
MapEntry(Locale('en'), 'English'),
|
MapEntry(Locale('en'), 'English'),
|
||||||
@ -86,16 +85,31 @@ Future<void> loadTranslations() async {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@pragma('vm:entry-point')
|
@pragma('vm:entry-point')
|
||||||
void backgroundFetchHeadlessTask(HeadlessTask task) async {
|
void startCallback() {
|
||||||
String taskId = task.taskId;
|
FlutterForegroundTask.setTaskHandler(MyTaskHandler());
|
||||||
bool isTimeout = task.timeout;
|
}
|
||||||
if (isTimeout) {
|
|
||||||
print('BG update task timed out.');
|
class MyTaskHandler extends TaskHandler {
|
||||||
BackgroundFetch.finish(taskId);
|
static const String incrementCountCommand = 'incrementCount';
|
||||||
return;
|
|
||||||
|
@override
|
||||||
|
Future<void> onStart(DateTime timestamp, TaskStarter starter) async {
|
||||||
|
print('onStart(starter: ${starter.name})');
|
||||||
|
bgUpdateCheck('bg_check', null);
|
||||||
}
|
}
|
||||||
await bgUpdateCheck(taskId, null);
|
|
||||||
BackgroundFetch.finish(taskId);
|
@override
|
||||||
|
void onRepeatEvent(DateTime timestamp) {
|
||||||
|
bgUpdateCheck('bg_check', null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<void> onDestroy(DateTime timestamp, bool isTimeout) async {
|
||||||
|
print('Foreground service onDestroy(isTimeout: $isTimeout)');
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void onReceiveData(Object data) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
void main() async {
|
void main() async {
|
||||||
@ -119,6 +133,7 @@ void main() async {
|
|||||||
}
|
}
|
||||||
final np = NotificationsProvider();
|
final np = NotificationsProvider();
|
||||||
await np.initialize();
|
await np.initialize();
|
||||||
|
FlutterForegroundTask.initCommunicationPort();
|
||||||
runApp(
|
runApp(
|
||||||
MultiProvider(
|
MultiProvider(
|
||||||
providers: [
|
providers: [
|
||||||
@ -136,7 +151,6 @@ void main() async {
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
BackgroundFetch.registerHeadlessTask(backgroundFetchHeadlessTask);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class Obtainium extends StatefulWidget {
|
class Obtainium extends StatefulWidget {
|
||||||
@ -152,32 +166,81 @@ class _ObtainiumState extends State<Obtainium> {
|
|||||||
@override
|
@override
|
||||||
void initState() {
|
void initState() {
|
||||||
super.initState();
|
super.initState();
|
||||||
initPlatformState();
|
// FlutterForegroundTask.addTaskDataCallback(onReceiveForegroundServiceData);
|
||||||
|
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||||
|
requestNonOptionalPermissions();
|
||||||
|
initForegroundService();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> initPlatformState() async {
|
Future<void> requestNonOptionalPermissions() async {
|
||||||
await BackgroundFetch.configure(
|
final NotificationPermission notificationPermission =
|
||||||
BackgroundFetchConfig(
|
await FlutterForegroundTask.checkNotificationPermission();
|
||||||
minimumFetchInterval: 15,
|
if (notificationPermission != NotificationPermission.granted) {
|
||||||
stopOnTerminate: false,
|
await FlutterForegroundTask.requestNotificationPermission();
|
||||||
startOnBoot: true,
|
}
|
||||||
enableHeadless: true,
|
if (!await FlutterForegroundTask.isIgnoringBatteryOptimizations) {
|
||||||
requiresBatteryNotLow: false,
|
await FlutterForegroundTask.requestIgnoreBatteryOptimization();
|
||||||
requiresCharging: false,
|
}
|
||||||
requiresStorageNotLow: false,
|
}
|
||||||
requiresDeviceIdle: false,
|
|
||||||
requiredNetworkType: NetworkType.ANY,
|
void initForegroundService() {
|
||||||
|
FlutterForegroundTask.init(
|
||||||
|
androidNotificationOptions: AndroidNotificationOptions(
|
||||||
|
channelId: 'bg_update',
|
||||||
|
channelName: tr('foregroundService'),
|
||||||
|
channelDescription: tr('foregroundService'),
|
||||||
|
onlyAlertOnce: true,
|
||||||
|
),
|
||||||
|
iosNotificationOptions: const IOSNotificationOptions(
|
||||||
|
showNotification: false,
|
||||||
|
playSound: false,
|
||||||
|
),
|
||||||
|
foregroundTaskOptions: ForegroundTaskOptions(
|
||||||
|
eventAction: ForegroundTaskEventAction.repeat(900000),
|
||||||
|
autoRunOnBoot: true,
|
||||||
|
autoRunOnMyPackageReplaced: true,
|
||||||
|
allowWakeLock: true,
|
||||||
|
allowWifiLock: true,
|
||||||
),
|
),
|
||||||
(String taskId) async {
|
|
||||||
await bgUpdateCheck(taskId, null);
|
|
||||||
BackgroundFetch.finish(taskId);
|
|
||||||
},
|
|
||||||
(String taskId) async {
|
|
||||||
context.read<LogsProvider>().add('BG update task timed out.');
|
|
||||||
BackgroundFetch.finish(taskId);
|
|
||||||
},
|
|
||||||
);
|
);
|
||||||
if (!mounted) return;
|
}
|
||||||
|
|
||||||
|
Future<ServiceRequestResult?> startForegroundService(bool restart) async {
|
||||||
|
if (await FlutterForegroundTask.isRunningService) {
|
||||||
|
if (restart) {
|
||||||
|
return FlutterForegroundTask.restartService();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return FlutterForegroundTask.startService(
|
||||||
|
serviceTypes: [ForegroundServiceTypes.specialUse],
|
||||||
|
serviceId: 666,
|
||||||
|
notificationTitle: tr('foregroundService'),
|
||||||
|
notificationText: tr('fgServiceNotice'),
|
||||||
|
notificationIcon: NotificationIcon(
|
||||||
|
metaDataName: 'dev.imranr.obtainium.service.NOTIFICATION_ICON',
|
||||||
|
),
|
||||||
|
callback: startCallback,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
stopForegroundService() async {
|
||||||
|
if (await FlutterForegroundTask.isRunningService) {
|
||||||
|
return FlutterForegroundTask.stopService();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// void onReceiveForegroundServiceData(Object data) {
|
||||||
|
// print('onReceiveTaskData: $data');
|
||||||
|
// }
|
||||||
|
|
||||||
|
@override
|
||||||
|
void dispose() {
|
||||||
|
// Remove a callback to receive data sent from the TaskHandler.
|
||||||
|
// FlutterForegroundTask.removeTaskDataCallback(onReceiveForegroundServiceData);
|
||||||
|
super.dispose();
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@ -186,15 +249,18 @@ class _ObtainiumState extends State<Obtainium> {
|
|||||||
AppsProvider appsProvider = context.read<AppsProvider>();
|
AppsProvider appsProvider = context.read<AppsProvider>();
|
||||||
LogsProvider logs = context.read<LogsProvider>();
|
LogsProvider logs = context.read<LogsProvider>();
|
||||||
NotificationsProvider notifs = context.read<NotificationsProvider>();
|
NotificationsProvider notifs = context.read<NotificationsProvider>();
|
||||||
|
if (settingsProvider.updateInterval == 0) {
|
||||||
|
stopForegroundService();
|
||||||
|
} else {
|
||||||
|
startForegroundService(false);
|
||||||
|
}
|
||||||
if (settingsProvider.prefs == null) {
|
if (settingsProvider.prefs == null) {
|
||||||
settingsProvider.initializeSettings();
|
settingsProvider.initializeSettings();
|
||||||
} else {
|
} else {
|
||||||
bool isFirstRun = settingsProvider.checkAndFlipFirstRun();
|
bool isFirstRun = settingsProvider.checkAndFlipFirstRun();
|
||||||
if (isFirstRun) {
|
if (isFirstRun) {
|
||||||
logs.add('This is the first ever run of Obtainium.');
|
logs.add('This is the first ever run of Obtainium.');
|
||||||
// If this is the first run, ask for notification permissions and add Obtainium to the Apps list
|
// If this is the first run, add Obtainium to the Apps list
|
||||||
Permission.notification.request();
|
|
||||||
if (!fdroid) {
|
if (!fdroid) {
|
||||||
getInstalledInfo(obtainiumId)
|
getInstalledInfo(obtainiumId)
|
||||||
.then((value) {
|
.then((value) {
|
||||||
@ -236,68 +302,71 @@ class _ObtainiumState extends State<Obtainium> {
|
|||||||
notifs.checkLaunchByNotif();
|
notifs.checkLaunchByNotif();
|
||||||
});
|
});
|
||||||
|
|
||||||
return DynamicColorBuilder(
|
return WithForegroundTask(
|
||||||
builder: (ColorScheme? lightDynamic, ColorScheme? darkDynamic) {
|
child: DynamicColorBuilder(
|
||||||
// Decide on a colour/brightness scheme based on OS and user settings
|
builder: (ColorScheme? lightDynamic, ColorScheme? darkDynamic) {
|
||||||
ColorScheme lightColorScheme;
|
// Decide on a colour/brightness scheme based on OS and user settings
|
||||||
ColorScheme darkColorScheme;
|
ColorScheme lightColorScheme;
|
||||||
if (lightDynamic != null &&
|
ColorScheme darkColorScheme;
|
||||||
darkDynamic != null &&
|
if (lightDynamic != null &&
|
||||||
settingsProvider.useMaterialYou) {
|
darkDynamic != null &&
|
||||||
lightColorScheme = lightDynamic.harmonized();
|
settingsProvider.useMaterialYou) {
|
||||||
darkColorScheme = darkDynamic.harmonized();
|
lightColorScheme = lightDynamic.harmonized();
|
||||||
} else {
|
darkColorScheme = darkDynamic.harmonized();
|
||||||
lightColorScheme = ColorScheme.fromSeed(
|
} else {
|
||||||
seedColor: settingsProvider.themeColor,
|
lightColorScheme = ColorScheme.fromSeed(
|
||||||
|
seedColor: settingsProvider.themeColor,
|
||||||
|
);
|
||||||
|
darkColorScheme = ColorScheme.fromSeed(
|
||||||
|
seedColor: settingsProvider.themeColor,
|
||||||
|
brightness: Brightness.dark,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// set the background and surface colors to pure black in the amoled theme
|
||||||
|
if (settingsProvider.useBlackTheme) {
|
||||||
|
darkColorScheme = darkColorScheme
|
||||||
|
.copyWith(surface: Colors.black)
|
||||||
|
.harmonized();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (settingsProvider.useSystemFont) NativeFeatures.loadSystemFont();
|
||||||
|
|
||||||
|
return MaterialApp(
|
||||||
|
title: 'Obtainium',
|
||||||
|
localizationsDelegates: context.localizationDelegates,
|
||||||
|
supportedLocales: context.supportedLocales,
|
||||||
|
locale: context.locale,
|
||||||
|
navigatorKey: globalNavigatorKey,
|
||||||
|
debugShowCheckedModeBanner: false,
|
||||||
|
theme: ThemeData(
|
||||||
|
useMaterial3: true,
|
||||||
|
colorScheme: settingsProvider.theme == ThemeSettings.dark
|
||||||
|
? darkColorScheme
|
||||||
|
: lightColorScheme,
|
||||||
|
fontFamily: settingsProvider.useSystemFont
|
||||||
|
? 'SystemFont'
|
||||||
|
: 'Montserrat',
|
||||||
|
),
|
||||||
|
darkTheme: ThemeData(
|
||||||
|
useMaterial3: true,
|
||||||
|
colorScheme: settingsProvider.theme == ThemeSettings.light
|
||||||
|
? lightColorScheme
|
||||||
|
: darkColorScheme,
|
||||||
|
fontFamily: settingsProvider.useSystemFont
|
||||||
|
? 'SystemFont'
|
||||||
|
: 'Montserrat',
|
||||||
|
),
|
||||||
|
home: Shortcuts(
|
||||||
|
shortcuts: <LogicalKeySet, Intent>{
|
||||||
|
LogicalKeySet(LogicalKeyboardKey.select):
|
||||||
|
const ActivateIntent(),
|
||||||
|
},
|
||||||
|
child: const HomePage(),
|
||||||
|
),
|
||||||
);
|
);
|
||||||
darkColorScheme = ColorScheme.fromSeed(
|
},
|
||||||
seedColor: settingsProvider.themeColor,
|
),
|
||||||
brightness: Brightness.dark,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
// set the background and surface colors to pure black in the amoled theme
|
|
||||||
if (settingsProvider.useBlackTheme) {
|
|
||||||
darkColorScheme = darkColorScheme
|
|
||||||
.copyWith(surface: Colors.black)
|
|
||||||
.harmonized();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (settingsProvider.useSystemFont) NativeFeatures.loadSystemFont();
|
|
||||||
|
|
||||||
return MaterialApp(
|
|
||||||
title: 'Obtainium',
|
|
||||||
localizationsDelegates: context.localizationDelegates,
|
|
||||||
supportedLocales: context.supportedLocales,
|
|
||||||
locale: context.locale,
|
|
||||||
navigatorKey: globalNavigatorKey,
|
|
||||||
debugShowCheckedModeBanner: false,
|
|
||||||
theme: ThemeData(
|
|
||||||
useMaterial3: true,
|
|
||||||
colorScheme: settingsProvider.theme == ThemeSettings.dark
|
|
||||||
? darkColorScheme
|
|
||||||
: lightColorScheme,
|
|
||||||
fontFamily: settingsProvider.useSystemFont
|
|
||||||
? 'SystemFont'
|
|
||||||
: 'Montserrat',
|
|
||||||
),
|
|
||||||
darkTheme: ThemeData(
|
|
||||||
useMaterial3: true,
|
|
||||||
colorScheme: settingsProvider.theme == ThemeSettings.light
|
|
||||||
? lightColorScheme
|
|
||||||
: darkColorScheme,
|
|
||||||
fontFamily: settingsProvider.useSystemFont
|
|
||||||
? 'SystemFont'
|
|
||||||
: 'Montserrat',
|
|
||||||
),
|
|
||||||
home: Shortcuts(
|
|
||||||
shortcuts: <LogicalKeySet, Intent>{
|
|
||||||
LogicalKeySet(LogicalKeyboardKey.select): const ActivateIntent(),
|
|
||||||
},
|
|
||||||
child: const HomePage(),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
},
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
26
pubspec.lock
26
pubspec.lock
@ -104,10 +104,10 @@ packages:
|
|||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: battery_plus
|
name: battery_plus
|
||||||
sha256: a0409fe7d21905987eb1348ad57c634f913166f14f0c8936b73d3f5940fac551
|
sha256: fb794c34cee2e4ea31005fb17ff15e1d904951ec7f15eedead741021870ee834
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "6.2.1"
|
version: "6.2.2"
|
||||||
battery_plus_platform_interface:
|
battery_plus_platform_interface:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@ -216,18 +216,18 @@ packages:
|
|||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: device_info_plus
|
name: device_info_plus
|
||||||
sha256: "0c6396126421b590089447154c5f98a5de423b70cfb15b1578fd018843ee6f53"
|
sha256: "98f28b42168cc509abc92f88518882fd58061ea372d7999aecc424345c7bff6a"
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "11.4.0"
|
version: "11.5.0"
|
||||||
device_info_plus_platform_interface:
|
device_info_plus_platform_interface:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: device_info_plus_platform_interface
|
name: device_info_plus_platform_interface
|
||||||
sha256: "0b04e02b30791224b31969eb1b50d723498f402971bff3630bca2ba839bd1ed2"
|
sha256: e1ea89119e34903dca74b883d0dd78eb762814f97fb6c76f35e9ff74d261a18f
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "7.0.2"
|
version: "7.0.3"
|
||||||
dynamic_color:
|
dynamic_color:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
@ -377,6 +377,14 @@ packages:
|
|||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.7.1"
|
version: "0.7.1"
|
||||||
|
flutter_foreground_task:
|
||||||
|
dependency: "direct main"
|
||||||
|
description:
|
||||||
|
name: flutter_foreground_task
|
||||||
|
sha256: "9f1b25a81db95d7119d2c5cffc654048cbdd49d4056183e1beadc1a6a38f3e29"
|
||||||
|
url: "https://pub.dev"
|
||||||
|
source: hosted
|
||||||
|
version: "9.1.0"
|
||||||
flutter_keyboard_visibility:
|
flutter_keyboard_visibility:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@ -995,10 +1003,10 @@ packages:
|
|||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: synchronized
|
name: synchronized
|
||||||
sha256: "0669c70faae6270521ee4f05bffd2919892d42d1276e6c495be80174b6bc0ef6"
|
sha256: c254ade258ec8282947a0acbbc90b9575b4f19673533ee46f2f6e9b3aeefd7c0
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.3.1"
|
version: "3.4.0"
|
||||||
term_glyph:
|
term_glyph:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@ -1201,4 +1209,4 @@ packages:
|
|||||||
version: "6.3.0"
|
version: "6.3.0"
|
||||||
sdks:
|
sdks:
|
||||||
dart: ">=3.8.1 <4.0.0"
|
dart: ">=3.8.1 <4.0.0"
|
||||||
flutter: ">=3.27.0"
|
flutter: ">=3.29.0"
|
||||||
|
@ -16,7 +16,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev
|
|||||||
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
|
# 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: 1.1.57+2314
|
version: 1.1.58+2315
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
sdk: ^3.8.1
|
sdk: ^3.8.1
|
||||||
@ -94,6 +94,7 @@ dependencies:
|
|||||||
# package. See that file for information about deactivating specific lint
|
# package. See that file for information about deactivating specific lint
|
||||||
# rules and activating additional ones.
|
# rules and activating additional ones.
|
||||||
flutter_lints: ^6.0.0
|
flutter_lints: ^6.0.0
|
||||||
|
flutter_foreground_task: ^9.1.0
|
||||||
|
|
||||||
flutter_launcher_icons:
|
flutter_launcher_icons:
|
||||||
android: "ic_launcher"
|
android: "ic_launcher"
|
||||||
|
Reference in New Issue
Block a user