Compare commits

...

19 Commits

Author SHA1 Message Date
785bba1f45 Merge pull request #679 from ImranR98/dev
Don't auto-capitalize names (#669)
2023-07-15 19:36:26 -04:00
3befcbc16d Don't auto-capitalize names (#669) 2023-07-15 19:35:40 -04:00
be300608a9 Merge pull request #678 from ImranR98/dev
Make transition animation directional (#675), Fix missing update button bug (perform full load on foreground)
2023-07-15 19:23:49 -04:00
f05902925d Increment version 2023-07-15 19:23:00 -04:00
d32e7acc8f Fix missing update button bug (perform full load on foreground) 2023-07-15 19:20:17 -04:00
fda9e6195a Make transition animation directional (#675) 2023-07-15 18:54:53 -04:00
b5d91adb21 Merge pull request #677 from ImranR98/dev
Improve App load performance (#579)
2023-07-15 18:21:03 -04:00
1b52cb6233 Merge pull request #676 from Daviteusz/weblate-obtainium-translate
locale(pl): Update Polish translation
2023-07-15 18:20:44 -04:00
5669634b44 Merge pull request #673 from gidano/main
Update hu.json
2023-07-15 18:20:25 -04:00
d6bb365cf1 Merge pull request #671 from bluefly000/japanese-translation
Update ja.json
2023-07-15 18:20:05 -04:00
53b7cfb9bf Merge pull request #667 from TangyWrecker/main
Update ru.json
2023-07-15 18:19:52 -04:00
2558c851c0 Improve App load performance (#579) 2023-07-15 18:18:35 -04:00
a8aa63daa3 locale(pl): Update Polish translation
Co-authored-by: Daviteusz <imefiu3@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
2023-07-15 23:53:20 +02:00
d587e9f708 Update hu.json 2023-07-15 13:21:58 +02:00
e2a8f40e3e Update ru.json
Updated, fix and added \n for ru
2023-07-15 08:49:35 +03:00
1cc4241fac Update ja.json 2023-07-15 14:47:27 +09:00
bb98dfe0b3 Update ja.json 2023-07-15 14:09:13 +09:00
6395dd820b Update ru.json
Fix
2023-07-15 07:38:34 +03:00
e909c03356 Update ru.json 2023-07-15 07:10:46 +03:00
9 changed files with 79 additions and 60 deletions

View File

@ -233,9 +233,9 @@
"requiresCredentialsInSettings": "Ehhez további hitelesítő adatokra van szükség (a Beállításokban)",
"checkOnStart": "Egyszer az indításkor",
"tryInferAppIdFromCode": "Próbálja kikövetkeztetni az app azonosítót a forráskódból",
"removeOnExternalUninstall": "Automatically remove externally uninstalled Apps",
"pickHighestVersionCode": "Auto-select highest version code APK",
"checkUpdateOnDetailPage": "Check for updates on opening an App detail page",
"removeOnExternalUninstall": "A külsőleg eltávolított appok auto. eltávolítása",
"pickHighestVersionCode": "A legmagasabb verziószámú APK auto. kiválasztása",
"checkUpdateOnDetailPage": "Frissítések keresése az app részleteit tartalmazó oldal megnyitásakor",
"removeAppQuestion": {
"one": "Eltávolítja az alkalmazást?",
"other": "Eltávolítja az alkalmazást?"

View File

@ -135,7 +135,7 @@
"showWebInAppView": "アプリページにソースのWebページを表示する",
"pinUpdates": "アップデートがあるアプリをトップに固定する",
"updates": "アップデート",
"sourceSpecific": "Github アクセストークン",
"sourceSpecific": "ソース別の設定",
"appSource": "アプリのソース",
"noLogs": "ログはありません",
"appLogs": "アプリのログ",
@ -227,16 +227,16 @@
"overrideSource": "ソースの上書き",
"dontShowAgain": "二度と表示しない",
"dontShowTrackOnlyWarnings": "「追跡のみ」の警告を表示しない",
"dontShowAPKOriginWarnings": "APK Originの警告を表示しない",
"dontShowAPKOriginWarnings": "APKのダウンロード元の警告を表示しない",
"moveNonInstalledAppsToBottom": "未インストールのアプリをアプリ一覧の下部に移動させる",
"gitlabPATLabel": "GitLab パーソナルアクセストークン\n(検索を有効化する and Better APK Discovery)",
"gitlabPATLabel": "GitLab パーソナルアクセストークン\n(検索とより良いAPK検出の有効化)",
"about": "概要",
"requiresCredentialsInSettings": "これには追加の認証が必要です (設定にて)",
"checkOnStart": "Check for updates on startup",
"tryInferAppIdFromCode": "Try inferring App ID from source code",
"removeOnExternalUninstall": "Automatically remove externally uninstalled Apps",
"pickHighestVersionCode": "Auto-select highest version code APK",
"checkUpdateOnDetailPage": "Check for updates on opening an App detail page",
"checkOnStart": "起動時にアップデートを確認する",
"tryInferAppIdFromCode": "ソースコードからApp IDを推測する",
"removeOnExternalUninstall": "外部でアンインストールされたアプリを自動的に削除する",
"pickHighestVersionCode": "最も高いバージョンコードのAPKを自動的に選択する",
"checkUpdateOnDetailPage": "アプリの詳細ページを開く際にアップデートを確認する",
"removeAppQuestion": {
"one": "アプリを削除しますか?",
"other": "アプリを削除しますか?"

View File

@ -25,8 +25,8 @@
"bgUpdateTaskFinished": "Zakończono zadanie sprawdzania aktualizacji w tle",
"firstRun": "Jest to pierwsze uruchomienie Obtainium",
"settingUpdateCheckIntervalTo": "Ustawianie interwału aktualizacji na {}",
"githubPATLabel": "Osobisty Token Dostępu GitHub (zwiększa limit zapytań)",
"githubPATHint": "Wymagany format OTD: użytkownik:token",
"githubPATLabel": "Osobisty token dostępu GitHub (zwiększa limit zapytań)",
"githubPATHint": "Wymagany format: użytkownik:token",
"githubPATFormat": "użytkownik:token",
"includePrereleases": "Uwzględnij wersje wstępne",
"fallbackToOlderReleases": "Powracaj do starszych wersji",
@ -233,14 +233,14 @@
"dontShowTrackOnlyWarnings": "Nie wyświetlaj ostrzeżeń „Tylko obserwowana”",
"dontShowAPKOriginWarnings": "Nie pokazuj ostrzeżeń o pochodzeniu APK",
"moveNonInstalledAppsToBottom": "Przenieś niezainstalowane aplikacje na dół widoku aplikacji",
"gitlabPATLabel": "Osobisty Token Dostępu GitLab\n(umożliwia wyszukiwanie and Better APK Discovery)",
"gitlabPATLabel": "Osobisty token dostępu GitLab\n(Umożliwia wyszukiwanie i lepsze wykrywanie APK)",
"about": "Więcej informacji",
"requiresCredentialsInSettings": "Wymaga to dodatkowych poświadczeń (w Ustawieniach)",
"checkOnStart": "Sprawdź raz przy starcie",
"checkOnStart": "Sprawdź aktualizacje przy uruchomieniu",
"tryInferAppIdFromCode": "Spróbuj wywnioskować identyfikator aplikacji z kodu źródłowego",
"removeOnExternalUninstall": "Automatically remove externally uninstalled Apps",
"pickHighestVersionCode": "Auto-select highest version code APK",
"checkUpdateOnDetailPage": "Check for updates on opening an App detail page",
"removeOnExternalUninstall": "Automatyczne usuń odinstalowane zewnętrznie aplikacje",
"pickHighestVersionCode": "Automatycznie wybierz najwyższy kod wersji APK",
"checkUpdateOnDetailPage": "Sprawdzaj aktualizacje podczas otwierania strony szczegółów aplikacji",
"removeAppQuestion": {
"one": "Usunąć aplikację?",
"other": "Usunąć aplikacje?"

View File

@ -22,7 +22,7 @@
"githubPATFormat": "имя_пользователя:токен",
"includePrereleases": "Включить предварительные релизы",
"fallbackToOlderReleases": "Откатиться к более старым версиям",
"filterReleaseTitlesByRegEx": "Фильтровать заголовки релизов с помощью регулярного выражения",
"filterReleaseTitlesByRegEx": "Фильтровать заголовки релизов\nс помощью регулярного выражения",
"invalidRegEx": "Неверное регулярное выражение",
"noDescription": "Нет описания",
"cancel": "Отмена",
@ -33,7 +33,7 @@
"githubStarredRepos": "Помеченные звездочкой репозитории на GitHub",
"uname": "Имя пользователя",
"wrongArgNum": "Неправильное количество предоставленных аргументов",
"xIsTrackOnly": "{} является приложением только для отслеживания",
"xIsTrackOnly": "{} только для отслеживания",
"source": "Источник",
"app": "Приложение",
"appsFromSourceAreTrackOnly": "Приложения из этого источника являются 'только для отслеживания'.",
@ -100,7 +100,7 @@
"invalidInput": "Неверный ввод",
"importedX": "Импортировано {}",
"obtainiumImport": "Импорт в Obtainium",
"importFromURLList": "Импорт из списка URL-адреса",
"importFromURLList": "Импорт из списка URL-адресов",
"searchQuery": "Поисковый запрос",
"appURLList": "Список URL приложений",
"line": "Строка",
@ -183,7 +183,7 @@
"appId": "ID приложения",
"appWithIdOrNameNotFound": "Приложение с таким ID или названием не было найдено",
"reposHaveMultipleApps": "В хранилище может быть несколько приложений",
"fdroidThirdPartyRepo": "Хранилище F-Droid сторонних разработчиков",
"fdroidThirdPartyRepo": "Репозитории F-Droid сторонних разработчиков",
"steam": "Steam",
"steamMobile": "Steam Mobile",
"steamChat": "Steam Chat",
@ -211,7 +211,7 @@
"copiedToClipboard": "Скопировано в буфер обмена",
"storagePermissionDenied": "Отказано в доступе к хранилищу",
"selectedCategorizeWarning": "Это заменит все текущие настройки категорий для выбранных приложений.",
"filterAPKsByRegEx": "Фильтровать APK-файлы с помощью регулярного выражения",
"filterAPKsByRegEx": "Фильтровать APK-файлы с помощью\nрегулярного выражения",
"removeFromObtainium": "Удалить из Obtainium",
"uninstallFromDevice": "Удалить с устройства",
"onlyWorksWithNonVersionDetectApps": "Работает только для приложений с отключенным определением версии.",
@ -219,7 +219,7 @@
"releaseDateAsVersionExplanation": "Этот параметр следует использовать только для приложений, в которых определение версии не работает правильно, но имеется дата выпуска.",
"changes": "Изменения",
"releaseDate": "Дата выпуска",
"importFromURLsInFile": "Импортировать из URL-адресов в файл (например, OPML)",
"importFromURLsInFile": "Импорт из URL-адресов в файле (например, OPML)",
"versionDetection": "Определение версии",
"standardVersionDetection": "Стандартное определение версии",
"groupByCategory": "Группировать по категориям",
@ -229,12 +229,12 @@
"dontShowTrackOnlyWarnings": "Не показывать предупреждения о только отслеживаемых приложениях",
"dontShowAPKOriginWarnings": "Не показывать предупреждения об источнике APK-файлов",
"moveNonInstalledAppsToBottom": "Переместить неустановленные приложения вниз списка",
"gitlabPATLabel": "Персональный токен доступа GitLab\n(Включает поиск and Better APK Discovery)",
"gitlabPATLabel": "Персональный токен доступа GitLab\n(Включает поиск и улучшает обнаружение APK)",
"about": "О приложении",
"requiresCredentialsInSettings": "Для этого требуются дополнительные учетные данные (в настройках)",
"checkOnStart": "Проверять наличие обновлений при запуске",
"tryInferAppIdFromCode": "Попытаться определить ID приложения из исходного кода",
"removeOnExternalUninstall": "Автоматически удалять удаленные извне приложения",
"removeOnExternalUninstall": "Автоматически убирать из списка удаленные извне приложения",
"pickHighestVersionCode": "Автовыбор кода наивысшей версии APK",
"checkUpdateOnDetailPage": "Проверять наличие обновлений при открытии страницы представления приложения",
"removeAppQuestion": {
@ -258,8 +258,8 @@
"other": "{} Приложений"
},
"url": {
"one": "{} Ссылка",
"other": "{} Ссылки"
"one": "{} URL-адрес",
"other": "{} URL-адреса"
},
"minute": {
"one": "{} Минута",

View File

@ -21,7 +21,7 @@ import 'package:easy_localization/src/easy_localization_controller.dart';
// ignore: implementation_imports
import 'package:easy_localization/src/localization.dart';
const String currentVersion = '0.13.16';
const String currentVersion = '0.13.17';
const String currentReleaseTag =
'v$currentVersion-beta'; // KEEP THIS IN SYNC WITH GITHUB RELEASES

View File

@ -26,6 +26,7 @@ class NavigationPageItem {
class _HomePageState extends State<HomePage> {
List<int> selectedIndexHistory = [];
bool isReversing = false;
int prevAppCount = -1;
bool prevIsLoading = true;
@ -42,7 +43,16 @@ class _HomePageState extends State<HomePage> {
Widget build(BuildContext context) {
AppsProvider appsProvider = context.watch<AppsProvider>();
setIsReversing(int targetIndex) {
bool reversing = selectedIndexHistory.isNotEmpty &&
selectedIndexHistory.last > targetIndex;
setState(() {
isReversing = reversing;
});
}
switchToPage(int index) async {
setIsReversing(index);
if (index == 0) {
while ((pages[0].widget.key as GlobalKey<AppsPageState>).currentState !=
null) {
@ -79,6 +89,7 @@ class _HomePageState extends State<HomePage> {
child: Scaffold(
backgroundColor: Theme.of(context).colorScheme.surface,
body: PageTransitionSwitcher(
reverse: isReversing,
transitionBuilder: (
Widget child,
Animation<double> animation,
@ -104,13 +115,16 @@ class _HomePageState extends State<HomePage> {
.toList(),
onDestinationSelected: (int index) async {
HapticFeedback.selectionClick();
await switchToPage(index);
switchToPage(index);
},
selectedIndex:
selectedIndexHistory.isEmpty ? 0 : selectedIndexHistory.last,
),
),
onWillPop: () async {
setIsReversing(selectedIndexHistory.length >= 2
? selectedIndexHistory.reversed.toList()[1]
: 0);
if (selectedIndexHistory.isNotEmpty) {
setState(() {
selectedIndexHistory.removeLast();

View File

@ -117,7 +117,7 @@ class AppsProvider with ChangeNotifier {
foregroundStream = FGBGEvents.stream.asBroadcastStream();
foregroundSubscription = foregroundStream?.listen((event) async {
isForeground = event == FGBGType.foreground;
if (isForeground) await refreshInstallStatuses();
if (isForeground) await loadApps();
});
() async {
var cacheDirs = await getExternalCacheDirectories();
@ -725,21 +725,12 @@ class AppsProvider with ChangeNotifier {
notifyListeners();
var sp = SourceProvider();
List<List<String>> errors = [];
List<FileSystemEntity> newApps = (await getAppsDir())
List<App?> newApps = (await getAppsDir()) // Parse Apps from JSON
.listSync()
.where((item) => item.path.toLowerCase().endsWith('.json'))
.toList();
for (var e in newApps) {
.map((e) {
try {
var app = App.fromJson(jsonDecode(File(e.path).readAsStringSync()));
try {
var info = await getInstalledInfo(app.id);
sp.getSource(app.url, overrideSource: app.overrideSource);
apps[app.id] = AppInMemory(app, null, info);
notifyListeners();
} catch (e) {
errors.add([app.id, app.finalName, e.toString()]);
}
return App.fromJson(jsonDecode(File(e.path).readAsStringSync()));
} catch (err) {
if (err is FormatException) {
logs.add('Corrupt JSON when loading App (will be ignored): $e');
@ -748,28 +739,40 @@ class AppsProvider with ChangeNotifier {
rethrow;
}
}
}).toList();
for (var app in newApps) {
// Put Apps into memory to list them (fast)
if (app != null) {
try {
sp.getSource(app.url, overrideSource: app.overrideSource);
apps.update(
app.id,
(value) =>
AppInMemory(app, value.downloadProgress, value.installedInfo),
ifAbsent: () => AppInMemory(app, null, null));
} catch (e) {
errors.add([app.id, app.finalName, e.toString()]);
}
}
}
notifyListeners();
if (errors.isNotEmpty) {
removeApps(errors.map((e) => e[0]).toList());
NotificationsProvider().notify(
AppsRemovedNotification(errors.map((e) => [e[1], e[2]]).toList()));
}
loadingApps = false;
notifyListeners();
refreshInstallStatuses(useExistingInstalledInfo: true);
}
Future<void> refreshInstallStatuses(
{bool useExistingInstalledInfo = false}) async {
if (await doesInstalledAppsPluginWork()) {
for (var app in apps.values) {
// Check install status for each App (slow)
apps[app.app.id]?.installedInfo = await getInstalledInfo(app.app.id);
notifyListeners();
}
// Reconcile version differences
List<App> modifiedApps = [];
for (var app in apps.values) {
var moddedApp = getCorrectedInstallStatusAppIfPossible(
app.app,
useExistingInstalledInfo
? app.installedInfo
: await getInstalledInfo(app.app.id));
var moddedApp =
getCorrectedInstallStatusAppIfPossible(app.app, app.installedInfo);
if (moddedApp != null) {
modifiedApps.add(moddedApp);
}
@ -780,6 +783,7 @@ class AppsProvider with ChangeNotifier {
.where((a) => a.installedVersion == null)
.map((e) => e.id)
.toList();
// After reconciliation, delete externally uninstalled Apps if needed
if (removedAppIds.isNotEmpty) {
var settingsProvider = SettingsProvider();
await settingsProvider.initializeSettings();
@ -789,6 +793,9 @@ class AppsProvider with ChangeNotifier {
}
}
}
loadingApps = false;
notifyListeners();
}
Future<void> saveApps(List<App> apps,

View File

@ -594,9 +594,7 @@ class SourceProvider {
}
String apkVersion = apk.version.replaceAll('/', '-');
var name = currentApp != null ? currentApp.name.trim() : '';
name = name.isNotEmpty
? name
: apk.names.name[0].toUpperCase() + apk.names.name.substring(1);
name = name.isNotEmpty ? name : apk.names.name;
return App(
currentApp?.id ??
((!source.appIdInferIsOptional ||
@ -606,7 +604,7 @@ class SourceProvider {
: null) ??
generateTempID(standardUrl, additionalSettings),
standardUrl,
apk.names.author[0].toUpperCase() + apk.names.author.substring(1),
apk.names.author,
name,
currentApp?.installedVersion,
apkVersion,

View File

@ -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.13.16+180 # When changing this, update the tag in main() accordingly
version: 0.13.17+181 # When changing this, update the tag in main() accordingly
environment:
sdk: '>=2.18.2 <3.0.0'