From cd17627f80a2682492480a858041d6042aad00b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=85=B1=E5=A4=A9=E5=B0=8F=E7=A6=BD=E5=85=BD?= Date: Tue, 5 Apr 2022 21:46:43 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=97=A5=E5=BF=97=E6=9F=A5?= =?UTF-8?q?=E7=9C=8B=20=E4=BF=AE=E5=A4=8D=E5=B5=8C=E5=A5=97=E8=B7=AF?= =?UTF-8?q?=E7=94=B1=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ipa.sh | 2 +- lib/src/main.dart | 9 ++- lib/src/network/eh_cache_interceptor.dart | 2 +- lib/src/network/eh_request.dart | 6 +- .../setting/account/setting_account_page.dart | 2 +- .../pages/setting/advanced/log/log_page.dart | 1 - .../advanced/setting_advanced_page.dart | 1 - .../setting/style/setting_style_page.dart | 4 +- lib/src/pages/start_page.dart | 70 ++++++++++--------- lib/src/pages/webview/webview_page.dart | 4 +- lib/src/service/download_service.dart | 8 +-- lib/src/service/storage_service.dart | 2 +- lib/src/service/tag_translation_service.dart | 2 +- lib/src/setting/advanced_setting.dart | 4 +- lib/src/setting/download_setting.dart | 4 +- lib/src/setting/eh_setting.dart | 4 +- lib/src/setting/favorite_setting.dart | 4 +- lib/src/setting/read_setting.dart | 4 +- lib/src/setting/site_setting.dart | 4 +- lib/src/setting/style_setting.dart | 8 ++- lib/src/setting/tab_bar_setting.dart | 4 +- lib/src/setting/user_setting.dart | 4 +- lib/src/utils/log.dart | 8 ++- lib/src/utils/route_util.dart | 20 ++++-- lib/src/utils/size_util.dart | 2 +- 25 files changed, 107 insertions(+), 76 deletions(-) diff --git a/ipa.sh b/ipa.sh index c989d981..7640c4fb 100644 --- a/ipa.sh +++ b/ipa.sh @@ -1,6 +1,6 @@ version=$(head -n 5 pubspec.yaml | tail -n 1 | cut -d ' ' -f 2) -flutter build ios --release --no-codesign --obfuscate --split-debug-info=build/app/outputs/symbols -t lib/src/main.dart \ +flutter build ios --release --obfuscate --split-debug-info=build/app/outputs/symbols -t lib/src/main.dart \ && mkdir ~/Desktop/Payload \ && cp -r build/ios/Release-iphoneos/Runner.app/ ~/Desktop/Payload/Runner.app/ \ && cd ~/Desktop \ diff --git a/lib/src/main.dart b/lib/src/main.dart index 43d5516c..4c7f4acf 100644 --- a/lib/src/main.dart +++ b/lib/src/main.dart @@ -1,6 +1,7 @@ import 'dart:ui'; import 'dart:async'; import 'package:flutter/cupertino.dart'; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:get_storage/get_storage.dart'; @@ -24,8 +25,12 @@ import 'package:jhentai/src/setting/user_setting.dart'; import 'package:jhentai/src/utils/log.dart'; void main() async { - FlutterError.presentError = - (FlutterErrorDetails details, {bool forceReport = false}) => Log.error(details.exception, null, details.stack); + FlutterError.onError = (FlutterErrorDetails details) { + if (kReleaseMode){ + Log.error(details.exception, null, details.stack); + } + FlutterError.presentError(details); + }; runZonedGuarded(() async { await init(); diff --git a/lib/src/network/eh_cache_interceptor.dart b/lib/src/network/eh_cache_interceptor.dart index ba115dbf..a4ff7fa3 100644 --- a/lib/src/network/eh_cache_interceptor.dart +++ b/lib/src/network/eh_cache_interceptor.dart @@ -50,7 +50,7 @@ class EHCacheInterceptor extends Interceptor { var cacheResponse = strategy.cacheResponse; if (cacheResponse != null) { // Cache hit - Log.info('hit cache: ${cacheResponse.url}', false); + Log.verbose('hit cache: ${cacheResponse.url}', false); // Update cached response if needed cacheResponse = await _updateCacheResponse(cacheResponse, cacheOptions); diff --git a/lib/src/network/eh_request.dart b/lib/src/network/eh_request.dart index cd6f567c..20fc37e8 100644 --- a/lib/src/network/eh_request.dart +++ b/lib/src/network/eh_request.dart @@ -110,7 +110,7 @@ class EHRequest { /// cache _dio.interceptors.add(EHCacheInterceptor(options: cacheOption)); - Log.info('init EHRequest success', false); + Log.verbose('init EHRequest success', false); } static Future storeEhCookiesStringForAllUri(String cookiesString) async { @@ -231,7 +231,7 @@ class EHRequest { return parser(response); } - Log.info('try redirect to EH site', false); + Log.verbose('try redirect to EH site', false); try { response = await _dio.get( galleryUrl.replaceFirst(EHConsts.EXIndex, EHConsts.EHIndex), @@ -246,7 +246,7 @@ class EHRequest { if (e.response?.statusCode != 404) { rethrow; } - Log.info('redirect to EH 404', false); + Log.verbose('redirect to EH 404', false); } response = await _dio.get( diff --git a/lib/src/pages/setting/account/setting_account_page.dart b/lib/src/pages/setting/account/setting_account_page.dart index 0763ee1f..319da909 100644 --- a/lib/src/pages/setting/account/setting_account_page.dart +++ b/lib/src/pages/setting/account/setting_account_page.dart @@ -87,7 +87,7 @@ class _LogoutDialog extends StatelessWidget { child: Text('OK'.tr, style: const TextStyle(color: Colors.red)), onPressed: () async { EHRequest.logout(); - until(null, (route) => !Get.isDialogOpen!); + until(predicate: (route) => !Get.isDialogOpen!); }, ), ], diff --git a/lib/src/pages/setting/advanced/log/log_page.dart b/lib/src/pages/setting/advanced/log/log_page.dart index ab9e38aa..a8ab8258 100644 --- a/lib/src/pages/setting/advanced/log/log_page.dart +++ b/lib/src/pages/setting/advanced/log/log_page.dart @@ -1,7 +1,6 @@ import 'dart:io' as io; import 'package:flutter/material.dart'; import 'package:get/get.dart'; -import 'package:jhentai/src/utils/size_util.dart'; import 'package:path/path.dart'; class LogPage extends StatefulWidget { diff --git a/lib/src/pages/setting/advanced/setting_advanced_page.dart b/lib/src/pages/setting/advanced/setting_advanced_page.dart index 683326fa..0e9a5b35 100644 --- a/lib/src/pages/setting/advanced/setting_advanced_page.dart +++ b/lib/src/pages/setting/advanced/setting_advanced_page.dart @@ -1,5 +1,4 @@ import 'dart:io' as io; -import 'dart:math'; import 'package:extended_image/extended_image.dart'; import 'package:flutter/material.dart'; diff --git a/lib/src/pages/setting/style/setting_style_page.dart b/lib/src/pages/setting/style/setting_style_page.dart index c51da083..2dfd7016 100644 --- a/lib/src/pages/setting/style/setting_style_page.dart +++ b/lib/src/pages/setting/style/setting_style_page.dart @@ -5,6 +5,8 @@ import 'package:jhentai/src/service/tag_translation_service.dart'; import 'package:jhentai/src/setting/style_setting.dart'; import 'package:jhentai/src/widget/loading_state_indicator.dart'; +import '../../../utils/size_util.dart'; + class SettingStylePage extends StatelessWidget { final TagTranslationService tagTranslationService = Get.find(); @@ -135,7 +137,7 @@ class SettingStylePage extends StatelessWidget { ), ), ), - if (Get.width >= 600) + if (fullScreenWidth >= 600) ListTile( title: Text('enableTabletLayout'.tr), trailing: Switch( diff --git a/lib/src/pages/start_page.dart b/lib/src/pages/start_page.dart index 8252a3f3..892d4291 100644 --- a/lib/src/pages/start_page.dart +++ b/lib/src/pages/start_page.dart @@ -1,17 +1,12 @@ import 'package:flutter/material.dart'; -import 'package:flutter/scheduler.dart'; -import 'package:flutter_screen_lock/flutter_screen_lock.dart'; import 'package:get/get.dart'; -import 'package:jhentai/src/config/theme_config.dart'; import 'package:jhentai/src/pages/blank_page.dart'; import 'package:jhentai/src/pages/home/home_page.dart'; import 'package:jhentai/src/routes/routes.dart'; -import 'package:jhentai/src/setting/advanced_setting.dart'; import 'package:jhentai/src/setting/style_setting.dart'; -import 'package:jhentai/src/utils/size_util.dart'; -import 'package:local_auth/local_auth.dart'; -import 'lock_page.dart'; +import '../utils/route_util.dart'; +import '../utils/size_util.dart'; const int left = 1; const int right = 2; @@ -22,31 +17,42 @@ class StartPage extends StatelessWidget { @override Widget build(BuildContext context) { - return Obx(() { - if (StyleSetting.enableTabletLayout.isFalse) { - return HomePage(); - } - - if (screenWidth < 600) { - StyleSetting.enableTabletLayout.value = false; - return HomePage(); - } - - /// tablet layout - return Row( - children: [ - Expanded( - child: Row( - children: [ - Expanded(child: _leftScreen()), - Container(width: 0.3, color: Colors.black), - ], - ), - ), - Expanded(child: _rightScreen()), - ], - ); - }); + /// use LayoutBuilder to listen to the screen resize + return LayoutBuilder( + builder: (context, constraints) => Obx( + () { + if (StyleSetting.enableTabletLayout.isFalse) { + StyleSetting.currentEnableTabletLayout.value = false; + return HomePage(); + } + + if (fullScreenWidth < 600) { + StyleSetting.currentEnableTabletLayout.value = false; + + /// pop all pages in right screen if exists + untilBlankPage(); + return HomePage(); + } + + StyleSetting.currentEnableTabletLayout.value = true; + + /// tablet layout + return Row( + children: [ + Expanded( + child: Row( + children: [ + Expanded(child: _leftScreen()), + Container(width: 0.3, color: Colors.black), + ], + ), + ), + Expanded(child: _rightScreen()), + ], + ); + }, + ), + ); } Widget _leftScreen() { diff --git a/lib/src/pages/webview/webview_page.dart b/lib/src/pages/webview/webview_page.dart index 1c862c46..77a512b0 100644 --- a/lib/src/pages/webview/webview_page.dart +++ b/lib/src/pages/webview/webview_page.dart @@ -67,8 +67,8 @@ class _WebviewPageState extends State { /// temporarily UserSetting.userName.value = ipbMemberId.toString(); until( - Routes.webview, - (route) => route.settings.name == Routes.settingAccount, + currentRoute: Routes.webview, + predicate: (route) => route.settings.name == Routes.settingAccount, ); await EHRequest.storeEhCookiesForAllUri(cookies); diff --git a/lib/src/service/download_service.dart b/lib/src/service/download_service.dart index 8a315da9..11b5294d 100644 --- a/lib/src/service/download_service.dart +++ b/lib/src/service/download_service.dart @@ -110,7 +110,7 @@ class DownloadService extends GetxService { downloadGallery(g, isFirstDownload: false); } } - Log.info('init DownloadService success, download task count: ${gallerys.length}', false); + Log.verbose('init DownloadService success, download task count: ${gallerys.length}', false); } /// begin or resume downloading all images of a gallery @@ -217,7 +217,7 @@ class DownloadService extends GetxService { ), ) .then((newThumbnails) { - Log.info('getMoreThumbnails success', false); + Log.verbose('getMoreThumbnails success', false); int from = serialNo ~/ SiteSetting.thumbnailsCountPerPage.value * SiteSetting.thumbnailsCountPerPage.value; for (int i = 0; i < newThumbnails.length; i++) { gid2ImageHrefs[gallery.gid]![from + i].value = newThumbnails[i]; @@ -250,7 +250,7 @@ class DownloadService extends GetxService { ), ) .then((image) async { - Log.info('parseImageUrl: $serialNo success', false); + Log.verbose('parseImageUrl: $serialNo success', false); image.downloadStatus = DownloadStatus.downloading; image.path = downloadPath; gid2Images[gallery.gid]![serialNo].value = image; @@ -292,7 +292,7 @@ class DownloadService extends GetxService { gid2SpeedComputer[gallery.gid]!.imageDownloadedBytes[serialNo].value = count; gid2SpeedComputer[gallery.gid]!.allImageDownloadedBytes += count; }).then((success) async { - Log.info('downloadImage: $serialNo success', false); + Log.verbose('downloadImage: $serialNo success', false); gid2downloadProgress[gallery.gid]!.update((progress) { progress?.curCount++; progress?.hasDownloaded[serialNo] = true; diff --git a/lib/src/service/storage_service.dart b/lib/src/service/storage_service.dart index dbe78556..8809a2ad 100644 --- a/lib/src/service/storage_service.dart +++ b/lib/src/service/storage_service.dart @@ -8,7 +8,7 @@ class StorageService extends GetxService { static void init() { Get.put(StorageService()); - Log.info('init StorageService success', false); + Log.verbose('init StorageService success', false); } Future write(String key, dynamic value) { diff --git a/lib/src/service/tag_translation_service.dart b/lib/src/service/tag_translation_service.dart index be90fd6d..6937abc2 100644 --- a/lib/src/service/tag_translation_service.dart +++ b/lib/src/service/tag_translation_service.dart @@ -28,7 +28,7 @@ class TagTranslationService extends GetxService { static void init() { Get.put(TagTranslationService()); - Log.info('init TagTranslationService success', false); + Log.verbose('init TagTranslationService success', false); } void onInit() { diff --git a/lib/src/setting/advanced_setting.dart b/lib/src/setting/advanced_setting.dart index c752bb43..031d1332 100644 --- a/lib/src/setting/advanced_setting.dart +++ b/lib/src/setting/advanced_setting.dart @@ -17,9 +17,9 @@ class AdvancedSetting { Map? map = Get.find().read>('advancedSetting'); if (map != null) { _initFromMap(map); - Log.info('init AdvancedSetting success', false); + Log.verbose('init AdvancedSetting success', false); } else { - Log.info('init AdvancedSetting success: default', false); + Log.verbose('init AdvancedSetting success: default', false); } } diff --git a/lib/src/setting/download_setting.dart b/lib/src/setting/download_setting.dart index ead0b65d..b599b328 100644 --- a/lib/src/setting/download_setting.dart +++ b/lib/src/setting/download_setting.dart @@ -11,9 +11,9 @@ class DownloadSetting { Map? map = Get.find().read>('downloadSetting'); if (map != null) { _initFromMap(map); - Log.info('init DownloadSetting success', false); + Log.verbose('init DownloadSetting success', false); } else { - Log.info('init DownloadSetting success: default', false); + Log.verbose('init DownloadSetting success: default', false); } } diff --git a/lib/src/setting/eh_setting.dart b/lib/src/setting/eh_setting.dart index 10097ffa..b0ac6edd 100644 --- a/lib/src/setting/eh_setting.dart +++ b/lib/src/setting/eh_setting.dart @@ -11,9 +11,9 @@ class EHSetting { Map? map = Get.find().read>('EHSetting'); if (map != null) { _initFromMap(map); - Log.info('init EHSetting success', false); + Log.verbose('init EHSetting success', false); } else { - Log.info('init EHSetting success: default', false); + Log.verbose('init EHSetting success: default', false); } } diff --git a/lib/src/setting/favorite_setting.dart b/lib/src/setting/favorite_setting.dart index a74adf1f..683211ec 100644 --- a/lib/src/setting/favorite_setting.dart +++ b/lib/src/setting/favorite_setting.dart @@ -42,9 +42,9 @@ class FavoriteSetting { Map? map = Get.find().read>('favoriteSetting'); if (map != null) { _initFromMap(map); - Log.info('init FavoriteSetting success', false); + Log.verbose('init FavoriteSetting success', false); } else { - Log.info('init FavoriteSetting success: default', false); + Log.verbose('init FavoriteSetting success: default', false); } /// listen to login and logout diff --git a/lib/src/setting/read_setting.dart b/lib/src/setting/read_setting.dart index 749758e8..c27d41d6 100644 --- a/lib/src/setting/read_setting.dart +++ b/lib/src/setting/read_setting.dart @@ -19,9 +19,9 @@ class ReadSetting { Map? map = Get.find().read>('readSetting'); if (map != null) { _initFromMap(map); - Log.info('init ReadSetting success', false); + Log.verbose('init ReadSetting success', false); } else { - Log.info('init ReadSetting success: default', false); + Log.verbose('init ReadSetting success: default', false); } } diff --git a/lib/src/setting/site_setting.dart b/lib/src/setting/site_setting.dart index 05254b3c..7506a92e 100644 --- a/lib/src/setting/site_setting.dart +++ b/lib/src/setting/site_setting.dart @@ -19,9 +19,9 @@ class SiteSetting { Map? map = Get.find().read>('siteSetting'); if (map != null) { _initFromMap(map); - Log.info('init SiteSetting success', false); + Log.verbose('init SiteSetting success', false); } else { - Log.info('init SiteSetting success: default', false); + Log.verbose('init SiteSetting success: default', false); } /// listen to login and logout diff --git a/lib/src/setting/style_setting.dart b/lib/src/setting/style_setting.dart index b38aa8a5..ef874f36 100644 --- a/lib/src/setting/style_setting.dart +++ b/lib/src/setting/style_setting.dart @@ -28,18 +28,21 @@ class StyleSetting { static Rx themeMode = EHThemeMode.light.obs; static Rx listMode = ListMode.listWithoutTags.obs; static Rx coverMode = CoverMode.cover.obs; + + /// if enableTabletLayout is true, currentEnableTabletLayout can also be false because of screen width limit. static RxBool enableTabletLayout = WidgetsBinding.instance!.window.physicalSize.width / WidgetsBinding.instance!.window.devicePixelRatio < 600 ? false.obs : true.obs; + static RxBool currentEnableTabletLayout = false.obs; static void init() { Map? map = Get.find().read>('styleSetting'); if (map != null) { _initFromMap(map); - Log.info('init StyleSetting success', false); + Log.verbose('init StyleSetting success', false); } else { - Log.info('init StyleSetting success: default', false); + Log.verbose('init StyleSetting success: default', false); } } @@ -99,5 +102,6 @@ class StyleSetting { listMode.value = ListMode.values[map['listMode']]; coverMode.value = CoverMode.values[map['coverMode']]; enableTabletLayout.value = map['enableTabletLayout']; + currentEnableTabletLayout.value = map['enableTabletLayout']; } } diff --git a/lib/src/setting/tab_bar_setting.dart b/lib/src/setting/tab_bar_setting.dart index 933369af..70b026f9 100644 --- a/lib/src/setting/tab_bar_setting.dart +++ b/lib/src/setting/tab_bar_setting.dart @@ -67,9 +67,9 @@ class TabBarSetting { Map? map = Get.find().read>('tabBarSetting'); if (map != null) { _initFromMap(map); - Log.info('init TabBarSetting success', false); + Log.verbose('init TabBarSetting success', false); } else { - Log.info('init TabBarSetting success: default', false); + Log.verbose('init TabBarSetting success: default', false); } } diff --git a/lib/src/setting/user_setting.dart b/lib/src/setting/user_setting.dart index 06868a9a..dfe862f7 100644 --- a/lib/src/setting/user_setting.dart +++ b/lib/src/setting/user_setting.dart @@ -12,9 +12,9 @@ class UserSetting { Map? map = Get.find().read>('userSetting'); if (map != null) { _initFromMap(map); - Log.info('init UserSetting success', false); + Log.verbose('init UserSetting success', false); } else { - Log.info('init UserSetting success, not logged in', false); + Log.verbose('init UserSetting success, not logged in', false); } } diff --git a/lib/src/utils/log.dart b/lib/src/utils/log.dart index 45bc4b27..d90233b3 100644 --- a/lib/src/utils/log.dart +++ b/lib/src/utils/log.dart @@ -29,7 +29,13 @@ class Log { output: FileOutput(file: logFile), ); - info('init LogUtil success', false); + PrettyPrinter.levelEmojis[Level.verbose] = '⚙ '; + verbose('init LogUtil success', false); + } + + static void verbose(Object? msg, [bool withStack = true]) { + _log.v(msg, null, withStack ? null : StackTrace.empty); + _logFile?.v(msg, null, withStack ? null : StackTrace.empty); } static void info(Object? msg, [bool withStack = true]) { diff --git a/lib/src/utils/route_util.dart b/lib/src/utils/route_util.dart index d167a9d5..18eb3474 100644 --- a/lib/src/utils/route_util.dart +++ b/lib/src/utils/route_util.dart @@ -15,7 +15,7 @@ Future? toNamed( int? id, }) { EHPage page = Routes.pages.firstWhere((page) => page.name == routeName); - if (StyleSetting.enableTabletLayout.isFalse || page.side == Side.fullScreen || id == fullScreen) { + if (StyleSetting.currentEnableTabletLayout.isFalse || page.side == Side.fullScreen || id == fullScreen) { return Get.toNamed( routeName, arguments: arguments, @@ -60,7 +60,7 @@ void back({ result: result, closeOverlays: closeOverlays, canPop: canPop, - id: StyleSetting.enableTabletLayout.isFalse + id: StyleSetting.currentEnableTabletLayout.isFalse ? null : side == Side.left ? left @@ -81,7 +81,7 @@ Future? offNamed( return Get.offNamed( routeName, arguments: arguments, - id: StyleSetting.enableTabletLayout.isFalse + id: StyleSetting.currentEnableTabletLayout.isFalse ? null : side == Side.left ? left @@ -93,11 +93,11 @@ Future? offNamed( ); } -void until(String? currentRoute, RoutePredicate predicate) { +void until({String? currentRoute, required RoutePredicate predicate}) { Side side = Routes.pages.firstWhereOrNull((page) => page.name == currentRoute)?.side ?? Side.fullScreen; return Get.until( predicate, - id: StyleSetting.enableTabletLayout.isFalse + id: StyleSetting.currentEnableTabletLayout.isFalse ? null : side == Side.left ? left @@ -106,3 +106,13 @@ void until(String? currentRoute, RoutePredicate predicate) { : null, ); } + +void untilBlankPage() { + if (!Get.keys.containsKey(right)) { + return; + } + Get.until( + (route) => route.settings.name == Routes.blank, + id: right, + ); +} diff --git a/lib/src/utils/size_util.dart b/lib/src/utils/size_util.dart index 00130ecd..dd86aaa2 100644 --- a/lib/src/utils/size_util.dart +++ b/lib/src/utils/size_util.dart @@ -3,6 +3,6 @@ import 'package:jhentai/src/setting/style_setting.dart'; double get fullScreenWidth => Get.width; -double get screenWidth => StyleSetting.enableTabletLayout.isTrue ? Get.width / 2 : Get.width; +double get screenWidth => StyleSetting.currentEnableTabletLayout.isTrue ? Get.width / 2 : Get.width; double get screenHeight => Get.height;