Add log-switch to app.

- New switch in More > Settings > About
"Enable logging".

When ON, it inits the AppLogger and shows the "Share app logs" button below.
When OFF, it disposes the AppLogger and hides the "Share app logs" button.
It also prevents the AppLogger from init.

OFF by default.

- added localizations accordingly.
This commit is contained in:
NBA2K1 2025-12-13 00:42:50 +01:00
parent 9ac6237caf
commit 284fccd1ef
39 changed files with 565 additions and 329 deletions

View file

@ -451,6 +451,7 @@
"downloaded_only": "المحملة فقط",
"downloaded_only_description": "إظهار الإدخالات المحملة فقط في مكتبتك",
"concurrent_downloads": "التحميلات المتزامنة",
"logs_on": "تفعيل التسجيل",
"share_app_logs": "مشاركة سجلات التطبيق",
"no_app_logs": "لا يوجد ملف log.txt!",
"failed": "فشل!",
@ -560,4 +561,4 @@
"show_scroll_percentage": "إظهار نسبة التمرير",
"remove_extra_paragraph_spacing": "إزالة المسافات الإضافية بين الفقرات",
"select_label_color": "تحديد لون {label}"
}
}

View file

@ -305,6 +305,7 @@
"default_subtitle_language": "ডিফল্ট উপশিৰোনাম ভাষা",
"follow_system_theme": "ছিষ্টেম থিম অনুসৰণ কৰক",
"concurrent_downloads": "সমসাময়িক ডাউনলোড",
"logs_on": "লগিং সক্ষম কৰক",
"share_app_logs": "এপ লগ শ্বেয়াৰ কৰক",
"no_app_logs": "কোনো log.txt ফাইল উপলব্ধ নাই!",
"failed": "বিফল!",

View file

@ -465,6 +465,7 @@
"downloaded_only": "Nur heruntergeladene",
"downloaded_only_description": "Nur heruntergeladene Einträge in deiner Bibliothek anzeigen",
"concurrent_downloads": "Gleichzeitige Downloads",
"logs_on": "Protokollierung aktivieren",
"share_app_logs": "App-Protokolle teilen",
"no_app_logs": "Keine log.txt Datei verfügbar!",
"failed": "Fehlgeschlagen!",

View file

@ -143,6 +143,7 @@
"nsfw_sources_info": "This does not prevent unofficial or potentially incorrectly flagged extensions from surfacing NSFW (18+) content within the app",
"version": "Version",
"check_for_update": "Check for update",
"logs_on": "Enable logging",
"share_app_logs": "Share app logs",
"no_app_logs": "No log.txt available!",
"failed": "Failed!",

View file

@ -449,6 +449,7 @@
"downloaded_only": "Solo descargados",
"downloaded_only_description": "Mostrar solo entradas descargadas en tu biblioteca",
"concurrent_downloads": "Descargas simultáneas",
"logs_on": "Activar registro",
"share_app_logs": "Compartir registros de la aplicación",
"no_app_logs": "¡No hay archivo log.txt disponible!",
"failed": "¡Fallido!",

View file

@ -451,6 +451,7 @@
"downloaded_only": "Solo descargados",
"downloaded_only_description": "Mostrar solo entradas descargadas en tu biblioteca",
"concurrent_downloads": "Descargas simultáneas",
"logs_on": "Habilitar registro",
"share_app_logs": "Compartir registros de la aplicación",
"no_app_logs": "¡No hay archivo log.txt disponible!",
"failed": "¡Fallido!",

View file

@ -455,6 +455,7 @@
"downloaded_only": "Téléchargés uniquement",
"downloaded_only_description": "Afficher uniquement les entrées téléchargées dans votre bibliothèque",
"concurrent_downloads": "Téléchargements simultanés",
"logs_on": "Activer la journalisation",
"share_app_logs": "Partager les journaux de l'application",
"no_app_logs": "Aucun fichier log.txt disponible !",
"failed": "Échoué !",

View file

@ -305,6 +305,7 @@
"default_subtitle_language": "डिफ़ॉल्ट उपशीर्षक भाषा",
"follow_system_theme": "सिस्टम थीम का पालन करें",
"concurrent_downloads": "समवर्ती डाउनलोड",
"logs_on": "लॉगिंग सक्षम करें",
"share_app_logs": "ऐप लॉग साझा करें",
"no_app_logs": "कोई log.txt फ़ाइल उपलब्ध नहीं!",
"failed": "विफल!",

View file

@ -449,6 +449,7 @@
"downloaded_only": "Hanya yang diunduh",
"downloaded_only_description": "Hanya tampilkan entri yang diunduh di perpustakaan Anda",
"concurrent_downloads": "Unduhan bersamaan",
"logs_on": "Aktifkan pencatatan",
"share_app_logs": "Bagikan log aplikasi",
"no_app_logs": "Tidak ada file log.txt tersedia!",
"failed": "Gagal!",

View file

@ -449,6 +449,7 @@
"downloaded_only": "Solo scaricati",
"downloaded_only_description": "Mostra solo le voci scaricate nella tua libreria",
"concurrent_downloads": "Download simultanei",
"logs_on": "Abilita registrazione",
"share_app_logs": "Condividi i log dell'app",
"no_app_logs": "Nessun file log.txt disponibile!",
"failed": "Fallito!",

View file

@ -304,6 +304,7 @@
"default_subtitle_language": "デフォルト字幕言語",
"follow_system_theme": "システムテーマに従う",
"concurrent_downloads": "同時ダウンロード",
"logs_on": "ログを有効にする",
"share_app_logs": "アプリログを共有",
"no_app_logs": "log.txtファイルが利用できません",
"failed": "失敗!",

View file

@ -449,6 +449,7 @@
"downloaded_only": "Apenas baixados",
"downloaded_only_description": "Mostrar apenas entradas baixadas na sua biblioteca",
"concurrent_downloads": "Downloads simultâneos",
"logs_on": "Ativar registro",
"share_app_logs": "Compartilhar logs do aplicativo",
"no_app_logs": "Nenhum arquivo log.txt disponível!",
"failed": "Falhou!",

View file

@ -449,6 +449,7 @@
"downloaded_only": "Apenas baixados",
"downloaded_only_description": "Mostrar apenas entradas baixadas na sua biblioteca",
"concurrent_downloads": "Downloads simultâneos",
"logs_on": "Ativar registro",
"share_app_logs": "Compartilhar logs do aplicativo",
"no_app_logs": "Nenhum arquivo log.txt disponível!",
"failed": "Falhou!",

View file

@ -449,6 +449,7 @@
"downloaded_only": "Только загруженные",
"downloaded_only_description": "Показывать только загруженные записи в вашей библиотеке",
"concurrent_downloads": "Одновременные загрузки",
"logs_on": "Включить ведение журнала",
"share_app_logs": "Поделиться журналами приложения",
"no_app_logs": "Файл log.txt недоступен!",
"failed": "Не удалось!",

View file

@ -452,6 +452,7 @@
"downloaded_only": "ที่ดาวน์โหลดแล้วเท่านั้น",
"downloaded_only_description": "แสดงเฉพาะรายการที่ดาวน์โหลดแล้วในห้องสมุดของคุณ",
"concurrent_downloads": "ดาวน์โหลดพร้อมกัน",
"logs_on": "เปิดการบันทึก",
"share_app_logs": "แชร์บันทึกแอป",
"no_app_logs": "ไม่มีไฟล์ log.txt!",
"failed": "ล้มเหลว!",

View file

@ -449,6 +449,7 @@
"downloaded_only": "Sadece indirilmiş",
"downloaded_only_description": "Kütüphanenizde yalnızca indirilmiş girişleri göster",
"concurrent_downloads": "Eş zamanlı indirmeler",
"logs_on": "Günlük kaydını etkinleştir",
"share_app_logs": "Uygulama günlüklerini paylaş",
"no_app_logs": "log.txt dosyası yok!",
"failed": "Başarısız!",

View file

@ -454,6 +454,7 @@
"downloaded_only": "仅已下载",
"downloaded_only_description": "仅显示库中已下载的条目",
"concurrent_downloads": "并发下载",
"logs_on": "启用日志",
"share_app_logs": "分享应用日志",
"no_app_logs": "没有可用的 log.txt 文件!",
"failed": "失败!",

View file

@ -935,6 +935,12 @@ abstract class AppLocalizations {
/// **'Check for update'**
String get check_for_update;
/// No description provided for @logs_on.
///
/// In en, this message translates to:
/// **'Enable logging'**
String get logs_on;
/// No description provided for @share_app_logs.
///
/// In en, this message translates to:

View file

@ -434,6 +434,9 @@ class AppLocalizationsAr extends AppLocalizations {
@override
String get check_for_update => 'التحقق من التحديثات';
@override
String get logs_on => 'تفعيل التسجيل';
@override
String get share_app_logs => 'مشاركة سجلات التطبيق';

View file

@ -436,6 +436,9 @@ class AppLocalizationsAs extends AppLocalizations {
@override
String get check_for_update => 'আপডেটৰ বাবে পৰীক্ষা কৰক';
@override
String get logs_on => 'লগিং সক্ষম কৰক';
@override
String get share_app_logs => 'এপ লগ শ্বেয়াৰ কৰক';

View file

@ -438,6 +438,9 @@ class AppLocalizationsDe extends AppLocalizations {
@override
String get check_for_update => 'Auf Aktualisierung prüfen';
@override
String get logs_on => 'Protokollierung aktivieren';
@override
String get share_app_logs => 'App-Protokolle teilen';

View file

@ -436,6 +436,9 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get check_for_update => 'Check for update';
@override
String get logs_on => 'Enable logging';
@override
String get share_app_logs => 'Share app logs';

View file

@ -440,6 +440,9 @@ class AppLocalizationsEs extends AppLocalizations {
@override
String get check_for_update => 'Buscar actualizaciones';
@override
String get logs_on => 'Activar registro';
@override
String get share_app_logs => 'Compartir registros de la aplicación';
@ -2245,6 +2248,9 @@ class AppLocalizationsEs419 extends AppLocalizationsEs {
@override
String get check_for_update => 'Buscar actualizaciones';
@override
String get logs_on => 'Habilitar registro';
@override
String get share_app_logs => 'Compartir registros de la aplicación';

View file

@ -442,6 +442,9 @@ class AppLocalizationsFr extends AppLocalizations {
@override
String get check_for_update => 'Rechercher des mises à jour';
@override
String get logs_on => 'Activer la journalisation';
@override
String get share_app_logs => 'Partager les journaux de l\'application';

View file

@ -436,6 +436,9 @@ class AppLocalizationsHi extends AppLocalizations {
@override
String get check_for_update => 'अपडेट के लिए जांचें';
@override
String get logs_on => 'लॉगिंग सक्षम करें';
@override
String get share_app_logs => 'ऐप लॉग साझा करें';

View file

@ -440,6 +440,9 @@ class AppLocalizationsId extends AppLocalizations {
@override
String get check_for_update => 'Periksa Pembaruan';
@override
String get logs_on => 'Aktifkan pencatatan';
@override
String get share_app_logs => 'Bagikan log aplikasi';

View file

@ -440,6 +440,9 @@ class AppLocalizationsIt extends AppLocalizations {
@override
String get check_for_update => 'Controlla aggiornamenti';
@override
String get logs_on => 'Abilita registrazione';
@override
String get share_app_logs => 'Condividi i log dell\'app';

View file

@ -431,6 +431,9 @@ class AppLocalizationsJa extends AppLocalizations {
@override
String get check_for_update => 'Check for update';
@override
String get logs_on => 'ログを有効にする';
@override
String get share_app_logs => 'アプリログを共有';

View file

@ -440,6 +440,9 @@ class AppLocalizationsPt extends AppLocalizations {
@override
String get check_for_update => 'Verificar atualização';
@override
String get logs_on => 'Ativar registro';
@override
String get share_app_logs => 'Compartilhar logs do aplicativo';
@ -2240,6 +2243,9 @@ class AppLocalizationsPtBr extends AppLocalizationsPt {
@override
String get check_for_update => 'Verificar atualização';
@override
String get logs_on => 'Ativar registro';
@override
String get share_app_logs => 'Compartilhar logs do aplicativo';

View file

@ -441,6 +441,9 @@ class AppLocalizationsRu extends AppLocalizations {
@override
String get check_for_update => 'Проверить обновления';
@override
String get logs_on => 'Включить ведение журнала';
@override
String get share_app_logs => 'Поделиться журналами приложения';

View file

@ -436,6 +436,9 @@ class AppLocalizationsTh extends AppLocalizations {
@override
String get check_for_update => 'ตรวจสอบการอัพเดท';
@override
String get logs_on => 'เปิดการบันทึก';
@override
String get share_app_logs => 'แชร์บันทึกแอป';

View file

@ -436,6 +436,9 @@ class AppLocalizationsTr extends AppLocalizations {
@override
String get check_for_update => 'Güncelleme Kontrol Et';
@override
String get logs_on => 'Günlük kaydını etkinleştir';
@override
String get share_app_logs => 'Uygulama günlüklerini paylaş';

View file

@ -427,6 +427,9 @@ class AppLocalizationsZh extends AppLocalizations {
@override
String get check_for_update => '检查更新';
@override
String get logs_on => '启用日志';
@override
String get share_app_logs => '分享应用日志';

View file

@ -127,6 +127,8 @@ class Settings {
int? pagePreloadAmount;
bool? enableLogs;
bool? checkForAppUpdates;
bool? checkForExtensionUpdates;
@ -357,6 +359,7 @@ class Settings {
this.sortLibraryAnime,
this.pagePreloadAmount = 6,
this.scaleType = ScaleType.fitScreen,
this.enableLogs = false,
this.checkForAppUpdates = true,
this.checkForExtensionUpdates = true,
this.backgroundColor = BackgroundColor.black,
@ -482,6 +485,7 @@ class Settings {
.map((e) => ChapterPageurls.fromJson(e))
.toList();
}
enableLogs = json['enableLogs'];
checkForAppUpdates = json['checkForAppUpdates'];
checkForExtensionUpdates = json['checkForExtensionUpdates'];
if (json['cookiesList'] != null) {
@ -720,6 +724,7 @@ class Settings {
?.map((v) => v.toJson())
.toList(),
'chapterPageUrlsList': chapterPageUrlsList?.map((v) => v.toJson()).toList(),
'enableLogs': enableLogs,
'checkForAppUpdates': checkForAppUpdates,
'checkForExtensionUpdates': checkForExtensionUpdates,
'cookiesList': cookiesList,

File diff suppressed because it is too large Load diff

View file

@ -9,9 +9,11 @@ import 'package:mangayomi/main.dart';
import 'package:mangayomi/models/settings.dart';
import 'package:mangayomi/modules/more/about/providers/check_for_update.dart';
import 'package:mangayomi/modules/more/about/providers/get_package_info.dart';
import 'package:mangayomi/modules/more/about/providers/logs_state.dart';
import 'package:mangayomi/modules/widgets/progress_center.dart';
import 'package:mangayomi/providers/l10n_providers.dart';
import 'package:mangayomi/providers/storage_provider.dart';
import 'package:mangayomi/utils/log/logger.dart';
import 'package:path/path.dart' as path;
import 'package:share_plus/share_plus.dart';
import 'package:url_launcher/url_launcher.dart';
@ -23,6 +25,7 @@ class AboutScreen extends ConsumerWidget {
Widget build(BuildContext context, WidgetRef ref) {
final l10n = l10nLocalizations(context);
final checkForUpdates = ref.watch(checkForAppUpdatesProvider);
final enableLogs = ref.watch(logsStateProvider);
return Scaffold(
appBar: AppBar(title: Text(l10n!.about)),
body: ref
@ -80,38 +83,58 @@ class AboutScreen extends ConsumerWidget {
},
title: Text(l10n.check_for_update),
),
ListTile(
onTap: () async {
final storage = StorageProvider();
final directory = await storage.getDefaultDirectory();
final file = File(
path.join(directory!.path, 'logs.txt'),
);
if (await file.exists()) {
if (Platform.isLinux) {
await Clipboard.setData(
ClipboardData(text: file.path),
);
}
if (context.mounted) {
final box =
context.findRenderObject() as RenderBox?;
SharePlus.instance.share(
ShareParams(
files: [XFile(file.path)],
text: "log.txt",
sharePositionOrigin:
box!.localToGlobal(Offset.zero) &
box.size,
),
);
}
SwitchListTile(
title: Text(l10n.logs_on),
value: enableLogs,
onChanged: (value) {
isar.writeTxnSync(() {
final settings = isar.settings.getSync(227);
isar.settings.putSync(
settings!..enableLogs = value,
);
});
ref.invalidate(logsStateProvider);
if (value) {
AppLogger.init();
} else {
botToast(l10n.no_app_logs);
AppLogger.dispose();
}
},
title: Text(l10n.share_app_logs),
),
if (enableLogs)
ListTile(
onTap: () async {
final storage = StorageProvider();
final directory = await storage
.getDefaultDirectory();
final file = File(
path.join(directory!.path, 'logs.txt'),
);
if (await file.exists()) {
if (Platform.isLinux) {
await Clipboard.setData(
ClipboardData(text: file.path),
);
}
if (context.mounted) {
final box =
context.findRenderObject() as RenderBox?;
SharePlus.instance.share(
ShareParams(
files: [XFile(file.path)],
text: "log.txt",
sharePositionOrigin:
box!.localToGlobal(Offset.zero) &
box.size,
),
);
}
} else {
botToast(l10n.no_app_logs);
}
},
title: Text(l10n.share_app_logs),
),
// ListTile(
// onTap: () {},
// title: const Text("What's news"),

View file

@ -0,0 +1,9 @@
import 'package:mangayomi/main.dart';
import 'package:mangayomi/models/settings.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
part 'logs_state.g.dart';
@riverpod
bool logsState(Ref ref) {
return isar.settings.getSync(227)?.enableLogs ?? false;
}

View file

@ -0,0 +1,50 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'logs_state.dart';
// **************************************************************************
// RiverpodGenerator
// **************************************************************************
// GENERATED CODE - DO NOT MODIFY BY HAND
// ignore_for_file: type=lint, type=warning
@ProviderFor(logsState)
const logsStateProvider = LogsStateProvider._();
final class LogsStateProvider extends $FunctionalProvider<bool, bool, bool>
with $Provider<bool> {
const LogsStateProvider._()
: super(
from: null,
argument: null,
retry: null,
name: r'logsStateProvider',
isAutoDispose: true,
dependencies: null,
$allTransitiveDependencies: null,
);
@override
String debugGetCreateSourceHash() => _$logsStateHash();
@$internal
@override
$ProviderElement<bool> $createElement($ProviderPointer pointer) =>
$ProviderElement(pointer);
@override
bool create(Ref ref) {
return logsState(ref);
}
/// {@macro riverpod.override_with_value}
Override overrideWithValue(bool value) {
return $ProviderOverride(
origin: this,
providerOverride: $SyncValueProvider<bool>(value),
);
}
}
String _$logsStateHash() => r'680ab781a039e0441394dc0b376b8add0fb80910';

View file

@ -1,6 +1,7 @@
import 'dart:async';
import 'dart:io';
import 'package:mangayomi/main.dart';
import 'package:mangayomi/models/settings.dart';
import 'package:mangayomi/providers/storage_provider.dart';
import 'package:path/path.dart' as path;
@ -12,6 +13,8 @@ class AppLogger {
/// Initialize the logger
static Future<void> init() async {
final enabled = isar.settings.getSync(227)?.enableLogs ?? false;
if (!enabled) return;
final storage = StorageProvider();
final directory = await storage.getDefaultDirectory();
_logFile = File(path.join(directory!.path, 'logs.txt'));