diff --git a/lib/common/widgets/dialog/export_import.dart b/lib/common/widgets/dialog/export_import.dart index fc7c9a090..4d01ff6c0 100644 --- a/lib/common/widgets/dialog/export_import.dart +++ b/lib/common/widgets/dialog/export_import.dart @@ -4,6 +4,7 @@ import 'dart:io' show File; import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/utils/extension/context_ext.dart'; +import 'package:PiliPlus/utils/storage_utils.dart'; import 'package:PiliPlus/utils/utils.dart'; import 'package:file_picker/file_picker.dart'; import 'package:flutter/material.dart'; @@ -28,7 +29,7 @@ void exportToLocalFile({ required ValueGetter localFileName, }) { final res = utf8.encode(onExport()); - Utils.saveBytes2File( + StorageUtils.saveBytes2File( name: 'piliplus_${localFileName()}_' '${DateFormat('yyyyMMddHHmmss').format(DateTime.now())}.json', diff --git a/lib/common/widgets/floating_navigation_bar.dart b/lib/common/widgets/floating_navigation_bar.dart index 267757bd7..46838ca14 100644 --- a/lib/common/widgets/floating_navigation_bar.dart +++ b/lib/common/widgets/floating_navigation_bar.dart @@ -724,7 +724,7 @@ class _NavigationBarDefaultsM3 extends NavigationBarThemeData { late final _colors = Theme.of(context).colorScheme; late final _textTheme = Theme.of(context).textTheme; - BorderSide get borderSide => _colors.brightness.isDark + BorderSide get borderSide => _colors.isDark ? const BorderSide(color: Color(0x08FFFFFF)) : const BorderSide(color: Color(0x08000000)); @@ -753,7 +753,7 @@ class _NavigationBarDefaultsM3 extends NavigationBarThemeData { @override Color? get indicatorColor => - _colors.brightness.isDark ? _indicatorDark : _indicatorLight; + _colors.isDark ? _indicatorDark : _indicatorLight; @override ShapeBorder? get indicatorShape => const StadiumBorder(); diff --git a/lib/common/widgets/image_viewer/gallery_viewer.dart b/lib/common/widgets/image_viewer/gallery_viewer.dart index 122a3bf51..0d9adbbcc 100644 --- a/lib/common/widgets/image_viewer/gallery_viewer.dart +++ b/lib/common/widgets/image_viewer/gallery_viewer.dart @@ -28,6 +28,7 @@ import 'package:PiliPlus/common/widgets/scroll_physics.dart'; import 'package:PiliPlus/main.dart' show tmpPadding; import 'package:PiliPlus/models/common/image_preview_type.dart'; import 'package:PiliPlus/plugin/pl_player/utils/fullscreen.dart'; +import 'package:PiliPlus/utils/device_utils.dart'; import 'package:PiliPlus/utils/extension/num_ext.dart'; import 'package:PiliPlus/utils/extension/string_ext.dart'; import 'package:PiliPlus/utils/image_utils.dart'; @@ -179,8 +180,7 @@ class _GalleryViewerState extends State void _initHideSystemBar() { if (Platform.isAndroid) { if (showSystemBar_) { - final view = WidgetsBinding.instance.platformDispatcher.views.first; - final size = view.physicalSize / view.devicePixelRatio; + final size = DeviceUtils.size; _hideSystemBar = !MaxScreenSize.isWindowMode( width: size.width, height: size.height, diff --git a/lib/common/widgets/video_card/video_card_v.dart b/lib/common/widgets/video_card/video_card_v.dart index 7c998f794..ee12a9687 100644 --- a/lib/common/widgets/video_card/video_card_v.dart +++ b/lib/common/widgets/video_card/video_card_v.dart @@ -13,10 +13,10 @@ import 'package:PiliPlus/models_new/video/video_detail/dimension.dart'; import 'package:PiliPlus/utils/app_scheme.dart'; import 'package:PiliPlus/utils/date_utils.dart'; import 'package:PiliPlus/utils/duration_utils.dart'; +import 'package:PiliPlus/utils/extension/dimension_ext.dart'; import 'package:PiliPlus/utils/id_utils.dart'; import 'package:PiliPlus/utils/page_utils.dart'; import 'package:PiliPlus/utils/platform_utils.dart'; -import 'package:PiliPlus/utils/utils.dart'; import 'package:flutter/material.dart' hide LayoutBuilder; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:intl/intl.dart'; @@ -44,7 +44,7 @@ class VideoCardV extends StatelessWidget { Dimension? dimension; if (videoItem is RcmdVideoItemAppModel) { if (videoItem.uri case final uri?) { - isVertical = Utils.getDimensionFromUri(uri); + isVertical = uri.isVerticalFromUri; } } if (cid == null) { diff --git a/lib/main.dart b/lib/main.dart index 3c55517b3..bc08179a5 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -17,6 +17,7 @@ import 'package:PiliPlus/services/service_locator.dart'; import 'package:PiliPlus/utils/cache_manager.dart'; import 'package:PiliPlus/utils/calc_window_position.dart'; import 'package:PiliPlus/utils/date_utils.dart'; +import 'package:PiliPlus/utils/device_utils.dart'; import 'package:PiliPlus/utils/extension/iterable_ext.dart'; import 'package:PiliPlus/utils/extension/theme_ext.dart'; import 'package:PiliPlus/utils/json_file_handler.dart'; @@ -89,7 +90,7 @@ Future _initAppPath() async { } Future _initSdkInt() async { - Utils.sdkInt = (await DeviceInfoPlugin().androidInfo).version.sdkInt; + DeviceUtils.sdkInt = (await DeviceInfoPlugin().androidInfo).version.sdkInt; } void main() async { @@ -233,8 +234,6 @@ class MyApp extends StatelessWidget { static ColorScheme? _light, _dark; - static ThemeData? darkThemeData; - static void _onBack() { if (SmartDialog.checkExist()) { SmartDialog.dismiss(); @@ -260,13 +259,13 @@ class MyApp extends StatelessWidget { late final brandColor = colorThemeTypes[Pref.customColor].color; late final variant = Pref.schemeVariant; return ( - ThemeUtils.getThemeData( + ThemeUtils.lightTheme = ThemeUtils.getThemeData( colorScheme: dynamicColor ? _light! : brandColor.asColorSchemeSeed(variant, .light), isDynamic: dynamicColor, ), - ThemeUtils.getThemeData( + ThemeUtils.darkTheme = ThemeUtils.getThemeData( isDark: true, colorScheme: dynamicColor ? _dark! @@ -283,7 +282,7 @@ class MyApp extends StatelessWidget { title: Constants.appName, theme: light, darkTheme: dark, - themeMode: Pref.themeMode, + themeMode: ThemeUtils.themeMode = Pref.themeMode, localizationsDelegates: const [ GlobalCupertinoLocalizations.delegate, GlobalMaterialLocalizations.delegate, diff --git a/lib/models/dynamics/result.dart b/lib/models/dynamics/result.dart index 4aff0b96d..c061165da 100644 --- a/lib/models/dynamics/result.dart +++ b/lib/models/dynamics/result.dart @@ -7,9 +7,9 @@ import 'package:PiliPlus/models/model_avatar.dart'; import 'package:PiliPlus/models/model_owner.dart'; import 'package:PiliPlus/models_new/live/live_feed_index/watched_show.dart'; import 'package:PiliPlus/utils/extension/iterable_ext.dart'; +import 'package:PiliPlus/utils/parse_int.dart'; import 'package:PiliPlus/utils/parse_string.dart'; import 'package:PiliPlus/utils/storage_pref.dart'; -import 'package:PiliPlus/utils/utils.dart'; class DynamicsDataModel { bool? hasMore; @@ -90,7 +90,7 @@ class DynamicsDataModel { } offset = json['offset']; - total = Utils.safeToInt(json['total']); + total = safeToInt(json['total']); } } @@ -306,7 +306,7 @@ class ModuleCollection { ModuleCollection.fromJson(Map json) { count = json['count']; - id = Utils.safeToInt(json['id']); + id = safeToInt(json['id']); name = json['name']; title = json['title']; } @@ -350,7 +350,7 @@ class ModuleBlocked { ModuleBlocked.fromJson(Map json) { bgImg = json['bg_img'] == null ? null : BgImg.fromJson(json['bg_img']); - blockedType = Utils.safeToInt(json['blocked_type']); + blockedType = safeToInt(json['blocked_type']); button = json['button'] == null ? null : Button.fromJson(json['button']); title = json['title']; hintMessage = json['hint_message']; @@ -401,7 +401,7 @@ class Basic { Basic.fromJson(Map json) { commentIdStr = json['comment_id_str']; - commentType = Utils.safeToInt(json['comment_type']); + commentType = safeToInt(json['comment_type']); ridStr = json['rid_str']; } } @@ -422,7 +422,7 @@ class ModuleAuthorModel extends Avatar { } pubAction = json['pub_action']; pubTime = json['pub_time']; - pubTs = json['pub_ts'] == 0 ? null : Utils.safeToInt(json['pub_ts']); + pubTs = json['pub_ts'] == 0 ? null : safeToInt(json['pub_ts']); type = json['type']; if (PendantAvatar.showDecorate) { decorate = json['decorate'] == null @@ -432,7 +432,7 @@ class ModuleAuthorModel extends Avatar { pendant = null; } isTop = json['is_top']; - badgeText = noneNullOrEmptyString(json['icon_badge']?['text']); + badgeText = nonNullOrEmptyString(json['icon_badge']?['text']); } } @@ -683,11 +683,11 @@ class Vote { String? title; Vote.fromJson(Map json) { - joinNum = Utils.safeToInt(json['join_num']); - voteId = Utils.safeToInt(json['vote_id']); + joinNum = safeToInt(json['join_num']); + voteId = safeToInt(json['vote_id']); title = - noneNullOrEmptyString(json['title']) ?? - noneNullOrEmptyString(json['desc']); + nonNullOrEmptyString(json['title']) ?? + nonNullOrEmptyString(json['desc']); } } @@ -740,10 +740,10 @@ class Reserve { desc1 = json['desc1'] == null ? null : Desc.fromJson(json['desc1']); desc2 = json['desc2'] == null ? null : Desc.fromJson(json['desc2']); desc3 = json['desc3'] == null ? null : Desc.fromJson(json['desc3']); - reserveTotal = Utils.safeToInt(json['reserve_total']); - rid = Utils.safeToInt(json['rid']); - state = Utils.safeToInt(json['state']); - state = Utils.safeToInt(json['state']); + reserveTotal = safeToInt(json['reserve_total']); + rid = safeToInt(json['rid']); + state = safeToInt(json['state']); + state = safeToInt(json['state']); title = json['title']; } } @@ -765,11 +765,11 @@ class ReserveBtn { String? jumpUrl; ReserveBtn.fromJson(Map json) { - status = Utils.safeToInt(json['status']); - type = Utils.safeToInt(json['type']); + status = safeToInt(json['status']); + type = safeToInt(json['type']); checkText = json['check']?['text'] ?? '已预约'; uncheckText = json['uncheck']?['text'] ?? '预约'; - disable = Utils.safeToInt(json['uncheck']?['disable']); + disable = safeToInt(json['uncheck']?['disable']); jumpText = json['jump_style']?['text']; jumpUrl = json['jump_url']; } @@ -929,7 +929,7 @@ class Music { String? label; Music.fromJson(Map json) { - id = Utils.safeToInt(json['id']); + id = safeToInt(json['id']); cover = json['cover']; title = json['title']; label = json['label']; @@ -1016,8 +1016,8 @@ class LivePlayInfo { }); factory LivePlayInfo.fromJson(Map json) => LivePlayInfo( - roomId: Utils.safeToInt(json["room_id"]), - liveStatus: Utils.safeToInt(json["live_status"]), + roomId: safeToInt(json["room_id"]), + liveStatus: safeToInt(json["live_status"]), title: json["title"], cover: json["cover"], areaName: json["area_name"], @@ -1037,7 +1037,7 @@ class DynamicTopicModel { String? name; DynamicTopicModel.fromJson(Map json) { - id = Utils.safeToInt(json['id']); + id = safeToInt(json['id']); name = json['name']; } } @@ -1072,8 +1072,8 @@ class DynamicArchiveModel { int? seasonId; DynamicArchiveModel.fromJson(Map json) { - id = Utils.safeToInt(json['id']); - aid = Utils.safeToInt(json['aid']); + id = safeToInt(json['id']); + aid = safeToInt(json['aid']); badge = json['badge'] == null ? null : Badge.fromJson(json['badge']); bvid = json['bvid'] ?? json['epid'].toString() ?? ' '; cover = json['cover']; @@ -1081,9 +1081,9 @@ class DynamicArchiveModel { jumpUrl = json['jump_url']; stat = json['stat'] != null ? Stat.fromJson(json['stat']) : null; title = json['title']; - type = Utils.safeToInt(json['type']); - epid = Utils.safeToInt(json['epid']); - seasonId = Utils.safeToInt(json['season_id']); + type = safeToInt(json['type']); + epid = safeToInt(json['epid']); + seasonId = safeToInt(json['season_id']); } } @@ -1175,9 +1175,9 @@ class Emoji { Emoji.fromJson(Map json) { url = - noneNullOrEmptyString(json['webp_url']) ?? - noneNullOrEmptyString(json['gif_url']) ?? - noneNullOrEmptyString(json['icon_url']); + nonNullOrEmptyString(json['webp_url']) ?? + nonNullOrEmptyString(json['gif_url']) ?? + nonNullOrEmptyString(json['icon_url']); size = json['size'] ?? 1; } } @@ -1221,8 +1221,8 @@ class OpusPicModel extends PicModel { num? size; OpusPicModel.fromJson(Map json) { - width = Utils.safeToInt(json['width']); - height = Utils.safeToInt(json['height']); + width = safeToInt(json['width']); + height = safeToInt(json['height']); src = json['src']; url = json['url']; liveUrl = json['live_url']; @@ -1250,8 +1250,8 @@ class DynamicLiveModel { Map data = jsonDecode(json['content']); Map livePlayInfo = data['live_play_info']; - roomId = Utils.safeToInt(livePlayInfo['room_id']); - liveStatus = Utils.safeToInt(livePlayInfo['live_status']); + roomId = safeToInt(livePlayInfo['room_id']); + liveStatus = safeToInt(livePlayInfo['live_status']); cover = livePlayInfo['cover']; areaName = livePlayInfo['area_name']; title = livePlayInfo['title']; @@ -1283,8 +1283,8 @@ class DynamicLive2Model { badge = json['badge'] == null ? null : Badge.fromJson(json['badge']); cover = json['cover']; descFirst = json['desc_first']; - id = Utils.safeToInt(json['id']); - liveState = Utils.safeToInt(json['live_state']); + id = safeToInt(json['id']); + liveState = safeToInt(json['live_state']); title = json['title']; } } @@ -1297,7 +1297,7 @@ class ModuleTag { String? text; ModuleTag.fromJson(Map json) { - text = noneNullOrEmptyString(json['text']); + text = nonNullOrEmptyString(json['text']); } } @@ -1340,7 +1340,7 @@ class DynamicStat { bool? status; DynamicStat.fromJson(Map json) { - count = json['count'] == 0 ? null : Utils.safeToInt(json['count']); + count = json['count'] == 0 ? null : safeToInt(json['count']); status = json['status']; } } diff --git a/lib/models/dynamics/up.dart b/lib/models/dynamics/up.dart index 2b5bfe928..beca77eda 100644 --- a/lib/models/dynamics/up.dart +++ b/lib/models/dynamics/up.dart @@ -1,4 +1,4 @@ -import 'package:PiliPlus/utils/utils.dart'; +import 'package:PiliPlus/utils/parse_int.dart'; class FollowUpModel { FollowUpModel({ @@ -51,7 +51,7 @@ class LiveUsers { List? items; LiveUsers.fromJson(Map json) { - count = Utils.safeToInt(json['count']) ?? 0; + count = safeToInt(json['count']) ?? 0; group = json['group']; items = (json['items'] as List?) ?.map((e) => LiveUserItem.fromJson(e)) @@ -68,7 +68,7 @@ class LiveUserItem extends UpItem { LiveUserItem.fromJson(Map json) : super.fromJson(json) { isReserveRecall = json['is_reserve_recall']; jumpUrl = json['jump_url']; - roomId = Utils.safeToInt(json['room_id']); + roomId = safeToInt(json['room_id']); title = json['title']; } } @@ -89,7 +89,7 @@ class UpItem { UpItem.fromJson(Map json) { face = json['face']; hasUpdate = json['has_update']; - mid = Utils.safeToInt(json['mid']) ?? 0; + mid = safeToInt(json['mid']) ?? 0; uname = json['uname']; } diff --git a/lib/models/model_owner.dart b/lib/models/model_owner.dart index d7db6871c..50f836e38 100644 --- a/lib/models/model_owner.dart +++ b/lib/models/model_owner.dart @@ -1,5 +1,5 @@ import 'package:PiliPlus/models/model_video.dart'; -import 'package:PiliPlus/utils/utils.dart'; +import 'package:PiliPlus/utils/parse_int.dart'; import 'package:hive_ce/hive.dart'; part 'model_owner.g.dart'; @@ -21,7 +21,7 @@ class Owner implements BaseOwner { String? face; Owner.fromJson(Map json) { - mid = Utils.safeToInt(json["mid"]); + mid = safeToInt(json["mid"]); name = json["name"]; face = json['face']; } diff --git a/lib/models_new/live/live_feed_index/card_data_list_item.dart b/lib/models_new/live/live_feed_index/card_data_list_item.dart index 16e561fd0..41c68fc04 100644 --- a/lib/models_new/live/live_feed_index/card_data_list_item.dart +++ b/lib/models_new/live/live_feed_index/card_data_list_item.dart @@ -27,7 +27,7 @@ class CardLiveItem { this.areaV2Id, this.areaV2ParentId, this.watchedShow, - }) : _systemCover = noneNullOrEmptyString(systemCover); + }) : _systemCover = nonNullOrEmptyString(systemCover); factory CardLiveItem.fromJson(Map json) => CardLiveItem( roomid: json['roomid'] ?? json['id'], diff --git a/lib/models_new/live/live_superchat/item.dart b/lib/models_new/live/live_superchat/item.dart index 689a047e0..3862d8592 100644 --- a/lib/models_new/live/live_superchat/item.dart +++ b/lib/models_new/live/live_superchat/item.dart @@ -1,6 +1,7 @@ import 'package:PiliPlus/models_new/live/live_medal_wall/uinfo_medal.dart'; import 'package:PiliPlus/models_new/live/live_superchat/user_info.dart'; import 'package:PiliPlus/utils/global_data.dart'; +import 'package:PiliPlus/utils/parse_int.dart'; import 'package:PiliPlus/utils/parse_string.dart'; import 'package:PiliPlus/utils/utils.dart'; @@ -64,18 +65,18 @@ class SuperChatItem { }); factory SuperChatItem.fromJson(Map json) => SuperChatItem( - id: Utils.safeToInt(json['id']) ?? Utils.random.nextInt(2147483647), - uid: Utils.safeToInt(json['uid'])!, + id: safeToInt(json['id']) ?? Utils.random.nextInt(2147483647), + uid: safeToInt(json['uid'])!, price: json['price'], - backgroundImage: noneNullOrEmptyString(json['background_image']), + backgroundImage: nonNullOrEmptyString(json['background_image']), backgroundColor: json['background_color'] ?? '#EDF5FF', backgroundBottomColor: json['background_bottom_color'] ?? '#2A60B2', backgroundPriceColor: json['background_price_color'] ?? '#7497CD', messageFontColor: json['message_font_color'] ?? '#FFFFFF', - endTime: Utils.safeToInt(json['end_time'])!, + endTime: safeToInt(json['end_time'])!, message: json['message'], token: json['token'], - ts: Utils.safeToInt(json['ts'])!, + ts: safeToInt(json['ts'])!, userInfo: UserInfo.fromJson(json['user_info'] as Map), medalInfo: !GlobalData().showMedal || json['uinfo']?['medal'] == null ? null diff --git a/lib/models_new/space/space/reservation_card_list.dart b/lib/models_new/space/space/reservation_card_list.dart index 174b286b5..3fe8e6592 100644 --- a/lib/models_new/space/space/reservation_card_list.dart +++ b/lib/models_new/space/space/reservation_card_list.dart @@ -28,7 +28,7 @@ class ReservationCardItem { total: json['total'] ?? 0, isFollow: json['is_follow'] == 1, livePlanStartTime: json['live_plan_start_time'] as int?, - descText1: noneNullOrEmptyString(json['desc_text_1']?['text']), + descText1: nonNullOrEmptyString(json['desc_text_1']?['text']), dynamicId: json['dynamic_id'] as String?, lotteryPrizeInfo: json['lottery_prize_info'] == null ? null diff --git a/lib/models_new/space/space/top.dart b/lib/models_new/space/space/top.dart index d87410d40..bc66cf7de 100644 --- a/lib/models_new/space/space/top.dart +++ b/lib/models_new/space/space/top.dart @@ -28,7 +28,7 @@ class TopImage { final item = json['item']; final img = item['image']; title = json['title'] == null ? null : TopTitle.fromJson(json['title']); - _defaultImage = noneNullOrEmptyString(img?['default_image']); + _defaultImage = nonNullOrEmptyString(img?['default_image']); fullCover = json['cover']; double dy = 0; try { diff --git a/lib/models_new/video/video_detail/data.dart b/lib/models_new/video/video_detail/data.dart index b1e32ad66..aac04c2bd 100644 --- a/lib/models_new/video/video_detail/data.dart +++ b/lib/models_new/video/video_detail/data.dart @@ -103,6 +103,6 @@ class VideoDetailData { staff: (json["staff"] as List?) ?.map((item) => Staff.fromJson(item)) .toList(), - redirectUrl: noneNullOrEmptyString(json['redirect_url']), + redirectUrl: nonNullOrEmptyString(json['redirect_url']), ); } diff --git a/lib/pages/about/view.dart b/lib/pages/about/view.dart index 29ee5b55e..9e59f25ca 100644 --- a/lib/pages/about/view.dart +++ b/lib/pages/about/view.dart @@ -14,7 +14,7 @@ import 'package:PiliPlus/utils/accounts.dart'; import 'package:PiliPlus/utils/accounts/account.dart'; import 'package:PiliPlus/utils/cache_manager.dart'; import 'package:PiliPlus/utils/date_utils.dart'; -import 'package:PiliPlus/utils/extension/context_ext.dart'; +import 'package:PiliPlus/utils/device_utils.dart'; import 'package:PiliPlus/utils/extension/num_ext.dart'; import 'package:PiliPlus/utils/login_utils.dart'; import 'package:PiliPlus/utils/page_utils.dart'; @@ -268,7 +268,7 @@ Commit Hash: ${BuildConfig.commitHash}''', onTap: () => showImportExportDialog>( context, title: '设置', - localFileName: () => 'setting_${context.platformName}', + localFileName: () => 'setting_${DeviceUtils.platformName}', onExport: GStorage.exportAllSettings, onImport: GStorage.importAllJsonSettings, ), diff --git a/lib/pages/article/view.dart b/lib/pages/article/view.dart index 5d92d25f1..83c4fb835 100644 --- a/lib/pages/article/view.dart +++ b/lib/pages/article/view.dart @@ -22,6 +22,7 @@ import 'package:PiliPlus/utils/grid.dart'; import 'package:PiliPlus/utils/image_utils.dart'; import 'package:PiliPlus/utils/num_utils.dart'; import 'package:PiliPlus/utils/page_utils.dart'; +import 'package:PiliPlus/utils/share_utils.dart'; import 'package:PiliPlus/utils/utils.dart'; import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/material.dart'; @@ -427,7 +428,7 @@ class _ArticlePageState extends CommonDynPageState { icon: const Icon(Icons.more_vert, size: 19), itemBuilder: (BuildContext context) => [ PopupMenuItem( - onTap: () => Utils.shareText(controller.url), + onTap: () => ShareUtils.shareText(controller.url), child: const Row( mainAxisSize: MainAxisSize.min, children: [ @@ -620,7 +621,7 @@ class _ArticlePageState extends CommonDynPageState { text: '分享', icon: CustomIcons.share_node, stat: null, - onPressed: () => Utils.shareText(controller.url), + onPressed: () => ShareUtils.shareText(controller.url), ), ), Expanded( diff --git a/lib/pages/article/widgets/opus_content.dart b/lib/pages/article/widgets/opus_content.dart index 2cfe06f34..fa855d322 100644 --- a/lib/pages/article/widgets/opus_content.dart +++ b/lib/pages/article/widgets/opus_content.dart @@ -713,7 +713,7 @@ Widget moduleBlockedItem( ThemeData theme, ModuleBlocked moduleBlocked, ) { - late final isDarkMode = theme.brightness.isDark; + late final isDarkMode = theme.isDark; BoxDecoration? bgImg(double width) { return moduleBlocked.bgImg == null diff --git a/lib/pages/audio/controller.dart b/lib/pages/audio/controller.dart index fdb1ad174..35f445a6f 100644 --- a/lib/pages/audio/controller.dart +++ b/lib/pages/audio/controller.dart @@ -28,12 +28,14 @@ import 'package:PiliPlus/plugin/pl_player/models/play_status.dart'; import 'package:PiliPlus/services/service_locator.dart'; import 'package:PiliPlus/services/shutdown_timer_service.dart'; import 'package:PiliPlus/utils/accounts.dart'; +import 'package:PiliPlus/utils/connectivity_utils.dart'; import 'package:PiliPlus/utils/extension/iterable_ext.dart'; import 'package:PiliPlus/utils/extension/num_ext.dart'; import 'package:PiliPlus/utils/global_data.dart'; import 'package:PiliPlus/utils/id_utils.dart'; import 'package:PiliPlus/utils/page_utils.dart'; import 'package:PiliPlus/utils/platform_utils.dart'; +import 'package:PiliPlus/utils/share_utils.dart'; import 'package:PiliPlus/utils/storage_pref.dart'; import 'package:PiliPlus/utils/utils.dart'; import 'package:PiliPlus/utils/video_utils.dart'; @@ -121,7 +123,7 @@ class AudioController extends GetxController _querySponsorBlock(); _onOpenMedia(audioUrl, ua: BrowserUa.pc, referer: HttpString.baseUrl); } - Utils.isWiFi.then((isWiFi) { + ConnectivityUtils.isWiFi.then((isWiFi) { cacheAudioQa = isWiFi ? Pref.defaultAudioQa : Pref.defaultAudioQaCellular; if (!hasAudioUrl) { _queryPlayUrl(); @@ -554,7 +556,7 @@ class AudioController extends GetxController :final arc, :final owner, )) { - Utils.shareText( + ShareUtils.shareText( '${arc.title} ' 'UP主: ${owner.name}' ' - $audioUrl', diff --git a/lib/pages/audio/view.dart b/lib/pages/audio/view.dart index de5ffc288..432c8e10f 100644 --- a/lib/pages/audio/view.dart +++ b/lib/pages/audio/view.dart @@ -753,7 +753,7 @@ class _AudioPageState extends State { final primary = colorScheme.primary; final thumbGlowColor = primary.withAlpha(80); final bufferedBarColor = primary.withValues(alpha: 0.4); - final baseBarColor = colorScheme.brightness.isDark + final baseBarColor = colorScheme.isDark ? const Color(0x33FFFFFF) : const Color(0x33999999); Widget child = Obx( diff --git a/lib/pages/download/search/view.dart b/lib/pages/download/search/view.dart index 3272d0112..9451b362c 100644 --- a/lib/pages/download/search/view.dart +++ b/lib/pages/download/search/view.dart @@ -75,7 +75,7 @@ class _DownloadSearchPageState }, child: Text( '更新', - style: TextStyle(color: Get.theme.colorScheme.onSurface), + style: TextStyle(color: ColorScheme.of(context).onSurface), ), ), ]; diff --git a/lib/pages/dynamics/widgets/author_panel.dart b/lib/pages/dynamics/widgets/author_panel.dart index 46379727c..78a690379 100644 --- a/lib/pages/dynamics/widgets/author_panel.dart +++ b/lib/pages/dynamics/widgets/author_panel.dart @@ -14,6 +14,7 @@ import 'package:PiliPlus/models/dynamics/result.dart'; import 'package:PiliPlus/pages/dynamics/controller.dart'; import 'package:PiliPlus/pages/save_panel/view.dart'; import 'package:PiliPlus/utils/accounts.dart'; +import 'package:PiliPlus/utils/color_utils.dart'; import 'package:PiliPlus/utils/date_utils.dart'; import 'package:PiliPlus/utils/extension/context_ext.dart'; import 'package:PiliPlus/utils/extension/num_ext.dart'; @@ -22,7 +23,7 @@ import 'package:PiliPlus/utils/feed_back.dart'; import 'package:PiliPlus/utils/image_utils.dart'; import 'package:PiliPlus/utils/page_utils.dart'; import 'package:PiliPlus/utils/request_utils.dart'; -import 'package:PiliPlus/utils/utils.dart'; +import 'package:PiliPlus/utils/share_utils.dart'; import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/foundation.dart' show kDebugMode; import 'package:flutter/material.dart'; @@ -205,7 +206,7 @@ class AuthorPanel extends StatelessWidget { height: 1, fontSize: 11, fontFamily: Assets.digitalNum, - color: Utils.parseColor( + color: ColourUtils.parseColor( moduleAuthor.decorate!.fan!.color!, ), ), @@ -318,7 +319,7 @@ class AuthorPanel extends StatelessWidget { leading: const Icon(Icons.share_outlined, size: 19), onTap: () { Get.back(); - Utils.shareText( + ShareUtils.shareText( '${HttpString.dynamicShareBaseUrl}/${item.idStr}', ); }, diff --git a/lib/pages/dynamics/widgets/dynamic_panel.dart b/lib/pages/dynamics/widgets/dynamic_panel.dart index 36c707836..74ffe9bc6 100644 --- a/lib/pages/dynamics/widgets/dynamic_panel.dart +++ b/lib/pages/dynamics/widgets/dynamic_panel.dart @@ -260,7 +260,7 @@ class DynamicPanel extends StatelessWidget { padding: const .symmetric(horizontal: 8, vertical: 6), decoration: BoxDecoration( color: theme.colorScheme.secondaryContainer.withValues( - alpha: theme.brightness.isLight ? 0.5 : 0.7, + alpha: theme.isLight ? 0.5 : 0.7, ), borderRadius: const BorderRadius.all(Radius.circular(6)), ), diff --git a/lib/pages/dynamics_detail/view.dart b/lib/pages/dynamics_detail/view.dart index f6080dbea..a5db534c7 100644 --- a/lib/pages/dynamics_detail/view.dart +++ b/lib/pages/dynamics_detail/view.dart @@ -19,7 +19,7 @@ import 'package:PiliPlus/utils/extension/get_ext.dart'; import 'package:PiliPlus/utils/grid.dart'; import 'package:PiliPlus/utils/num_utils.dart'; import 'package:PiliPlus/utils/request_utils.dart'; -import 'package:PiliPlus/utils/utils.dart'; +import 'package:PiliPlus/utils/share_utils.dart'; import 'package:flutter/foundation.dart' show kDebugMode; import 'package:flutter/material.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; @@ -427,7 +427,7 @@ class _DynamicDetailPageState extends CommonDynPageState { icon: CustomIcons.share_node, text: '分享', stat: null, - onPressed: (_) => Utils.shareText( + onPressed: (_) => ShareUtils.shareText( '${HttpString.dynamicShareBaseUrl}/${controller.dynItem.idStr}', ), ), diff --git a/lib/pages/dynamics_topic/view.dart b/lib/pages/dynamics_topic/view.dart index 544046c85..6c76d3e40 100644 --- a/lib/pages/dynamics_topic/view.dart +++ b/lib/pages/dynamics_topic/view.dart @@ -18,6 +18,8 @@ import 'package:PiliPlus/utils/extension/theme_ext.dart'; import 'package:PiliPlus/utils/global_data.dart'; import 'package:PiliPlus/utils/num_utils.dart'; import 'package:PiliPlus/utils/page_utils.dart'; +import 'package:PiliPlus/utils/share_utils.dart'; +import 'package:PiliPlus/utils/theme_utils.dart'; import 'package:PiliPlus/utils/utils.dart'; import 'package:PiliPlus/utils/waterfall.dart'; import 'package:flutter/material.dart'; @@ -297,7 +299,7 @@ class _DynTopicPageState extends State with DynMixin { ), actions: [ IconButton( - onPressed: () => Utils.shareText( + onPressed: () => ShareUtils.shareText( '${_controller.topicName} https://m.bilibili.com/topic-detail?topic_id=${_controller.topicId}', ), // https://www.bilibili.com/v/topic/detail?topic_id=${_controller.topicId} @@ -320,7 +322,7 @@ class _DynTopicPageState extends State with DynMixin { return; } PageUtils.inAppWebview( - 'https://www.bilibili.com/h5/topic-active/topic-report?topic_id=${_controller.topicId}&topic_name=${_controller.topicName}&${Utils.themeUrl(theme.colorScheme.isDark)}', + 'https://www.bilibili.com/h5/topic-active/topic-report?topic_id=${_controller.topicId}&topic_name=${_controller.topicName}&${ThemeUtils.themeUrl(theme.isDark)}', ); }, ), diff --git a/lib/pages/emote/view.dart b/lib/pages/emote/view.dart index 8e8a35f94..5cbc89cef 100644 --- a/lib/pages/emote/view.dart +++ b/lib/pages/emote/view.dart @@ -9,7 +9,7 @@ import 'package:PiliPlus/models_new/emote/emote.dart'; import 'package:PiliPlus/models_new/emote/package.dart'; import 'package:PiliPlus/pages/emote/controller.dart'; import 'package:PiliPlus/utils/extension/theme_ext.dart'; -import 'package:PiliPlus/utils/utils.dart'; +import 'package:PiliPlus/utils/theme_utils.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; @@ -182,7 +182,7 @@ class _EmotePanelState extends State '/webview', parameters: { 'url': - 'https://www.bilibili.com/h5/mall/emoji-package/home?navhide=1&${Utils.themeUrl(theme.colorScheme.isDark)}', + 'https://www.bilibili.com/h5/mall/emoji-package/home?navhide=1&${ThemeUtils.themeUrl(theme.isDark)}', }, ), icon: const Icon(Icons.settings), diff --git a/lib/pages/fan/view.dart b/lib/pages/fan/view.dart index d10ec5d19..e3ff2cb4d 100644 --- a/lib/pages/fan/view.dart +++ b/lib/pages/fan/view.dart @@ -4,6 +4,7 @@ import 'package:PiliPlus/pages/fan/controller.dart'; import 'package:PiliPlus/pages/follow_type/view.dart'; import 'package:PiliPlus/pages/follow_type/widgets/item.dart'; import 'package:PiliPlus/pages/share/view.dart' show UserModel; +import 'package:PiliPlus/utils/parse_int.dart'; import 'package:PiliPlus/utils/platform_utils.dart'; import 'package:PiliPlus/utils/utils.dart'; import 'package:flutter/material.dart'; @@ -29,7 +30,7 @@ class FansPage extends StatefulWidget { Get.toNamed( '/fan', arguments: { - 'mid': Utils.safeToInt(mid), + 'mid': safeToInt(mid), 'name': name, }, ); diff --git a/lib/pages/fav/video/widgets/item.dart b/lib/pages/fav/video/widgets/item.dart index 6174490ea..a6ff4d73c 100644 --- a/lib/pages/fav/video/widgets/item.dart +++ b/lib/pages/fav/video/widgets/item.dart @@ -3,7 +3,7 @@ import 'package:PiliPlus/common/widgets/flutter/layout_builder.dart'; import 'package:PiliPlus/common/widgets/image/image_save.dart'; import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; import 'package:PiliPlus/models_new/fav/fav_folder/list.dart'; -import 'package:PiliPlus/utils/fav_utils.dart'; +import 'package:PiliPlus/utils/bili_utils.dart'; import 'package:flutter/material.dart' hide LayoutBuilder; class FavVideoItem extends StatelessWidget { @@ -97,7 +97,7 @@ class FavVideoItem extends StatelessWidget { ), const Spacer(), Text( - FavUtils.isPublicFavText(item.attr), + BiliUtils.isPublicFavText(item.attr), style: TextStyle( fontSize: fontSize, color: color, diff --git a/lib/pages/fav_create/view.dart b/lib/pages/fav_create/view.dart index 36d679bff..c0cbf7f78 100644 --- a/lib/pages/fav_create/view.dart +++ b/lib/pages/fav_create/view.dart @@ -5,9 +5,9 @@ import 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart'; import 'package:PiliPlus/http/fav.dart'; import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/http/msg.dart'; +import 'package:PiliPlus/utils/bili_utils.dart'; import 'package:PiliPlus/utils/extension/file_ext.dart'; import 'package:PiliPlus/utils/extension/theme_ext.dart'; -import 'package:PiliPlus/utils/fav_utils.dart'; import 'package:PiliPlus/utils/platform_utils.dart'; import 'package:easy_debounce/easy_throttle.dart'; import 'package:flutter/material.dart'; @@ -51,7 +51,7 @@ class _CreateFavPageState extends State { if (res case Success(:final response)) { _titleController.text = response.title; _introController.text = response.intro ?? ''; - _isPublic = FavUtils.isPublicFav(response.attr); + _isPublic = BiliUtils.isPublicFav(response.attr); _cover = response.cover; _attr = response.attr; } else { @@ -130,7 +130,7 @@ class _CreateFavPageState extends State { toolbarTitle: '裁剪', toolbarColor: theme.colorScheme.secondaryContainer, toolbarWidgetColor: theme.colorScheme.onSecondaryContainer, - statusBarLight: theme.colorScheme.isLight, + statusBarLight: theme.isLight, aspectRatioPresets: [CropAspectRatioPreset.ratio16x9], lockAspectRatio: true, hideBottomControls: true, @@ -180,7 +180,7 @@ class _CreateFavPageState extends State { child: Column( spacing: 12, children: [ - if (_attr == null || !FavUtils.isDefaultFav(_attr!)) + if (_attr == null || !BiliUtils.isDefaultFav(_attr!)) Builder( builder: (context) { return ListTile( @@ -289,11 +289,11 @@ class _CreateFavPageState extends State { Expanded( child: TextField( autofocus: true, - readOnly: _attr != null && FavUtils.isDefaultFav(_attr!), + readOnly: _attr != null && BiliUtils.isDefaultFav(_attr!), controller: _titleController, style: TextStyle( fontSize: 14, - color: _attr != null && FavUtils.isDefaultFav(_attr!) + color: _attr != null && BiliUtils.isDefaultFav(_attr!) ? theme.colorScheme.outline : null, ), @@ -318,7 +318,7 @@ class _CreateFavPageState extends State { ], ), ), - if (_attr == null || !FavUtils.isDefaultFav(_attr!)) + if (_attr == null || !BiliUtils.isDefaultFav(_attr!)) ListTile( tileColor: theme.colorScheme.onInverseSurface, title: Row( diff --git a/lib/pages/fav_detail/view.dart b/lib/pages/fav_detail/view.dart index a083e49cc..58119d060 100644 --- a/lib/pages/fav_detail/view.dart +++ b/lib/pages/fav_detail/view.dart @@ -14,9 +14,10 @@ import 'package:PiliPlus/pages/common/fab_mixin.dart' import 'package:PiliPlus/pages/dynamics_repost/view.dart'; import 'package:PiliPlus/pages/fav_detail/controller.dart'; import 'package:PiliPlus/pages/fav_detail/widget/fav_video_card.dart'; -import 'package:PiliPlus/utils/fav_utils.dart'; +import 'package:PiliPlus/utils/bili_utils.dart'; import 'package:PiliPlus/utils/grid.dart'; import 'package:PiliPlus/utils/request_utils.dart'; +import 'package:PiliPlus/utils/share_utils.dart'; import 'package:PiliPlus/utils/utils.dart'; import 'package:flutter/material.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; @@ -194,12 +195,12 @@ class _FavDetailPageState extends State with GridMixin { ), Obx(() { final attr = _favDetailController.folderInfo.value.attr; - return attr == -1 || !FavUtils.isPublicFav(attr) + return attr == -1 || !BiliUtils.isPublicFav(attr) ? const SizedBox.shrink() : IconButton( iconSize: 22, tooltip: '分享', - onPressed: () => Utils.shareText( + onPressed: () => ShareUtils.shareText( 'https://www.bilibili.com/medialist/detail/ml${_favDetailController.mediaId}', ), icon: const Icon(Icons.share), @@ -254,7 +255,7 @@ class _FavDetailPageState extends State with GridMixin { _favDetailController.onFav(folderInfo.favState == 1), child: Text('${folderInfo.favState == 1 ? '取消' : ''}收藏'), ), - if (FavUtils.isPublicFav(folderInfo.attr)) + if (BiliUtils.isPublicFav(folderInfo.attr)) PopupMenuItem( onTap: () => showModalBottomSheet( context: context, @@ -275,7 +276,7 @@ class _FavDetailPageState extends State with GridMixin { onTap: _favDetailController.cleanFav, child: const Text('清除失效内容'), ), - if (!FavUtils.isDefaultFav(folderInfo.attr)) ...[ + if (!BiliUtils.isDefaultFav(folderInfo.attr)) ...[ const PopupMenuDivider(height: 12), PopupMenuItem( onTap: () => showConfirmDialog( @@ -452,7 +453,7 @@ class _FavDetailPageState extends State with GridMixin { ], Text( '共${folderInfo.mediaCount}条视频 · ' - '${FavUtils.isPublicFavText(folderInfo.attr)}', + '${BiliUtils.isPublicFavText(folderInfo.attr)}', style: style, ), ], diff --git a/lib/pages/fav_panel/view.dart b/lib/pages/fav_panel/view.dart index 96238c5ea..dd9fed660 100644 --- a/lib/pages/fav_panel/view.dart +++ b/lib/pages/fav_panel/view.dart @@ -2,7 +2,7 @@ import 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart'; import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/models_new/fav/fav_folder/list.dart'; import 'package:PiliPlus/pages/common/common_intro_controller.dart'; -import 'package:PiliPlus/utils/fav_utils.dart'; +import 'package:PiliPlus/utils/bili_utils.dart'; import 'package:PiliPlus/utils/feed_back.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; @@ -65,13 +65,13 @@ class _FavPanelState extends State { return ListTile( onTap: onTap, dense: true, - leading: FavUtils.isPublicFav(item.attr) + leading: BiliUtils.isPublicFav(item.attr) ? const Icon(Icons.folder_outlined) : const Icon(Icons.lock_outline), minLeadingWidth: 0, title: Text(item.title), subtitle: Text( - '${item.mediaCount}个内容 . ${FavUtils.isPublicFavText(item.attr)}', + '${item.mediaCount}个内容 . ${BiliUtils.isPublicFavText(item.attr)}', ), trailing: Transform.scale( scale: 0.9, diff --git a/lib/pages/follow/view.dart b/lib/pages/follow/view.dart index 094db74c5..13688820e 100644 --- a/lib/pages/follow/view.dart +++ b/lib/pages/follow/view.dart @@ -8,6 +8,8 @@ import 'package:PiliPlus/pages/follow/child/child_controller.dart'; import 'package:PiliPlus/pages/follow/child/child_view.dart'; import 'package:PiliPlus/pages/follow/controller.dart'; import 'package:PiliPlus/pages/follow_tag_sort/view.dart'; +import 'package:PiliPlus/utils/bili_utils.dart'; +import 'package:PiliPlus/utils/parse_int.dart'; import 'package:PiliPlus/utils/platform_utils.dart'; import 'package:PiliPlus/utils/request_utils.dart'; import 'package:PiliPlus/utils/utils.dart'; @@ -26,7 +28,7 @@ class FollowPage extends StatefulWidget { Get.toNamed( '/follow', arguments: { - 'mid': Utils.safeToInt(mid), + 'mid': safeToInt(mid), 'name': name, }, ); @@ -135,7 +137,7 @@ class _FollowPageState extends State { return Obx(() { final item = _followController.tabs[index]; int? count = item.count; - if (Utils.isCustomFollowTag(item.tagid)) { + if (BiliUtils.isCustomFollowTag(item.tagid)) { return GestureDetector( behavior: HitTestBehavior.translucent, onLongPress: () { diff --git a/lib/pages/follow_tag_sort/view.dart b/lib/pages/follow_tag_sort/view.dart index 8c06b162e..0ba9fc0b0 100644 --- a/lib/pages/follow_tag_sort/view.dart +++ b/lib/pages/follow_tag_sort/view.dart @@ -3,7 +3,7 @@ import 'package:PiliPlus/http/follow.dart'; import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/models/member/tags.dart'; import 'package:PiliPlus/pages/follow/controller.dart'; -import 'package:PiliPlus/utils/utils.dart'; +import 'package:PiliPlus/utils/bili_utils.dart'; import 'package:flutter/material.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get.dart'; @@ -26,7 +26,7 @@ class _FollowTagSortPageState extends State void initState() { super.initState(); for (final e in widget.controller.tabs) { - if (Utils.isCustomFollowTag(e.tagid)) { + if (BiliUtils.isCustomFollowTag(e.tagid)) { _customTags.add(e); } else { _defTags.add(e); diff --git a/lib/pages/follow_type/follow_same/view.dart b/lib/pages/follow_type/follow_same/view.dart index 0b7e4d283..98a791088 100644 --- a/lib/pages/follow_type/follow_same/view.dart +++ b/lib/pages/follow_type/follow_same/view.dart @@ -1,6 +1,7 @@ import 'package:PiliPlus/pages/follow_type/follow_same/controller.dart'; import 'package:PiliPlus/pages/follow_type/view.dart'; import 'package:PiliPlus/utils/extension/get_ext.dart'; +import 'package:PiliPlus/utils/parse_int.dart'; import 'package:PiliPlus/utils/utils.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; @@ -16,7 +17,7 @@ class FollowSamePage extends StatefulWidget { Get.toNamed( '/sameFollowing', arguments: { - 'mid': Utils.safeToInt(mid), + 'mid': safeToInt(mid), 'name': name, }, ); diff --git a/lib/pages/follow_type/followed/view.dart b/lib/pages/follow_type/followed/view.dart index 89f5319ee..6b544af3a 100644 --- a/lib/pages/follow_type/followed/view.dart +++ b/lib/pages/follow_type/followed/view.dart @@ -1,6 +1,7 @@ import 'package:PiliPlus/pages/follow_type/followed/controller.dart'; import 'package:PiliPlus/pages/follow_type/view.dart'; import 'package:PiliPlus/utils/extension/get_ext.dart'; +import 'package:PiliPlus/utils/parse_int.dart'; import 'package:PiliPlus/utils/utils.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; @@ -16,7 +17,7 @@ class FollowedPage extends StatefulWidget { Get.toNamed( '/followed', arguments: { - 'mid': Utils.safeToInt(mid), + 'mid': safeToInt(mid), 'name': name, }, ); diff --git a/lib/pages/live/view.dart b/lib/pages/live/view.dart index 3fe46b972..d72e725cf 100644 --- a/lib/pages/live/view.dart +++ b/lib/pages/live/view.dart @@ -18,7 +18,7 @@ import 'package:PiliPlus/utils/extension/theme_ext.dart'; import 'package:PiliPlus/utils/grid.dart'; import 'package:PiliPlus/utils/page_utils.dart'; import 'package:PiliPlus/utils/platform_utils.dart'; -import 'package:PiliPlus/utils/utils.dart'; +import 'package:PiliPlus/utils/theme_utils.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:material_design_icons_flutter/material_design_icons_flutter.dart'; @@ -154,7 +154,7 @@ class _LivePageState extends State parameters: { 'uaType': 'mob', 'url': - 'https://www.bilibili.com/h5/match/data/home?navhide=1&${Utils.themeUrl(theme.brightness.isDark)}', + 'https://www.bilibili.com/h5/match/data/home?navhide=1&${ThemeUtils.themeUrl(theme.isDark)}', }, ), ), diff --git a/lib/pages/live_room/contribution_rank/view.dart b/lib/pages/live_room/contribution_rank/view.dart index b29e6d144..8a64d5c55 100644 --- a/lib/pages/live_room/contribution_rank/view.dart +++ b/lib/pages/live_room/contribution_rank/view.dart @@ -9,6 +9,7 @@ import 'package:PiliPlus/models/common/live/live_contribution_rank_type.dart'; import 'package:PiliPlus/models_new/live/live_contribution_rank/item.dart'; import 'package:PiliPlus/pages/live_room/contribution_rank/controller.dart'; import 'package:PiliPlus/pages/member/widget/medal_widget.dart'; +import 'package:PiliPlus/utils/color_utils.dart'; import 'package:PiliPlus/utils/extension/scroll_controller_ext.dart'; import 'package:PiliPlus/utils/utils.dart'; import 'package:flutter/foundation.dart' show kDebugMode; @@ -228,7 +229,7 @@ class _Item extends StatelessWidget { textScaler: .noScaling, style: TextStyle( fontWeight: FontWeight.bold, - color: Utils.index2Color(index, colorScheme.outline), + color: ColourUtils.index2Color(index, colorScheme.outline), fontSize: 16, fontStyle: FontStyle.italic, ), diff --git a/lib/pages/live_room/controller.dart b/lib/pages/live_room/controller.dart index 604ec8b8e..327f212e3 100644 --- a/lib/pages/live_room/controller.dart +++ b/lib/pages/live_room/controller.dart @@ -26,6 +26,7 @@ import 'package:PiliPlus/plugin/pl_player/utils/danmaku_options.dart'; import 'package:PiliPlus/services/service_locator.dart'; import 'package:PiliPlus/tcp/live.dart'; import 'package:PiliPlus/utils/accounts.dart'; +import 'package:PiliPlus/utils/connectivity_utils.dart'; import 'package:PiliPlus/utils/danmaku_utils.dart'; import 'package:PiliPlus/utils/duration_utils.dart'; import 'package:PiliPlus/utils/extension/iterable_ext.dart'; @@ -33,6 +34,7 @@ import 'package:PiliPlus/utils/global_data.dart'; import 'package:PiliPlus/utils/num_utils.dart'; import 'package:PiliPlus/utils/platform_utils.dart'; import 'package:PiliPlus/utils/storage_pref.dart'; +import 'package:PiliPlus/utils/theme_utils.dart'; import 'package:PiliPlus/utils/utils.dart'; import 'package:PiliPlus/utils/video_utils.dart'; import 'package:canvas_danmaku/canvas_danmaku.dart'; @@ -177,7 +179,7 @@ class LiveRoomController extends GetxController { } Future queryLiveUrl({bool autoFullScreenFlag = false}) async { - currentQn ??= await Utils.isWiFi + currentQn ??= await ConnectivityUtils.isWiFi ? Pref.liveQuality : Pref.liveQualityCellular; final res = await LiveHttp.liveRoomInfo( @@ -244,7 +246,7 @@ class LiveRoomController extends GetxController { onPressed: Get.back, child: Text( '关闭', - style: TextStyle(color: Get.theme.colorScheme.outline), + style: TextStyle(color: ThemeUtils.theme.colorScheme.outline), ), ), TextButton( diff --git a/lib/pages/live_room/superchat/superchat_card.dart b/lib/pages/live_room/superchat/superchat_card.dart index 5a542d283..f90e51c26 100644 --- a/lib/pages/live_room/superchat/superchat_card.dart +++ b/lib/pages/live_room/superchat/superchat_card.dart @@ -4,6 +4,7 @@ import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; import 'package:PiliPlus/models/common/image_type.dart'; import 'package:PiliPlus/models_new/live/live_superchat/item.dart'; import 'package:PiliPlus/pages/member/widget/medal_widget.dart'; +import 'package:PiliPlus/utils/color_utils.dart'; import 'package:PiliPlus/utils/image_utils.dart'; import 'package:PiliPlus/utils/page_utils.dart'; import 'package:PiliPlus/utils/platform_utils.dart'; @@ -135,7 +136,7 @@ class _SuperChatCardState extends State { @override Widget build(BuildContext context) { final item = widget.item; - final bottomColor = Utils.parseColor(item.backgroundBottomColor); + final bottomColor = ColourUtils.parseColor(item.backgroundBottomColor); final border = BorderSide(color: bottomColor); void showMenu(TapUpDetails e) => _showMenu(e.globalPosition, item); @@ -144,7 +145,7 @@ class _SuperChatCardState extends State { maxLines: 1, overflow: .ellipsis, style: TextStyle( - color: Utils.parseColor(item.userInfo.nameColor), + color: ColourUtils.parseColor(item.userInfo.nameColor), ), ); if (item.medalInfo case final medal?) { @@ -175,7 +176,7 @@ class _SuperChatCardState extends State { child: Container( decoration: BoxDecoration( borderRadius: const .vertical(top: .circular(8)), - color: Utils.parseColor(item.backgroundColor), + color: ColourUtils.parseColor(item.backgroundColor), border: Border(top: border, left: border, right: border), image: item.backgroundImage == null ? null @@ -205,7 +206,9 @@ class _SuperChatCardState extends State { Text( "¥${item.price}", style: TextStyle( - color: Utils.parseColor(item.backgroundPriceColor), + color: ColourUtils.parseColor( + item.backgroundPriceColor, + ), ), ), ], @@ -235,7 +238,7 @@ class _SuperChatCardState extends State { child: Text( item.message, style: TextStyle( - color: Utils.parseColor(item.messageFontColor), + color: ColourUtils.parseColor(item.messageFontColor), decoration: widget.persistentSC && item.deleted ? .lineThrough : null, diff --git a/lib/pages/live_room/view.dart b/lib/pages/live_room/view.dart index 95b40fd12..c732e4699 100644 --- a/lib/pages/live_room/view.dart +++ b/lib/pages/live_room/view.dart @@ -43,6 +43,7 @@ import 'package:PiliPlus/utils/max_screen_size.dart'; import 'package:PiliPlus/utils/mobile_observer.dart'; import 'package:PiliPlus/utils/page_utils.dart'; import 'package:PiliPlus/utils/platform_utils.dart'; +import 'package:PiliPlus/utils/share_utils.dart'; import 'package:PiliPlus/utils/storage.dart'; import 'package:PiliPlus/utils/storage_key.dart'; import 'package:PiliPlus/utils/utils.dart'; @@ -633,7 +634,7 @@ class _LiveRoomPageState extends State ), if (PlatformUtils.isMobile) PopupMenuItem( - onTap: () => Utils.shareText(liveUrl), + onTap: () => ShareUtils.shareText(liveUrl), child: Row( spacing: 10, mainAxisSize: MainAxisSize.min, diff --git a/lib/pages/login/controller.dart b/lib/pages/login/controller.dart index d9bf12348..64090acf8 100644 --- a/lib/pages/login/controller.dart +++ b/lib/pages/login/controller.dart @@ -13,6 +13,7 @@ import 'package:PiliPlus/pages/login/geetest/geetest_webview_dialog.dart'; import 'package:PiliPlus/utils/accounts.dart'; import 'package:PiliPlus/utils/accounts/account.dart'; import 'package:PiliPlus/utils/platform_utils.dart'; +import 'package:PiliPlus/utils/theme_utils.dart'; import 'package:dio/dio.dart'; import 'package:flutter/foundation.dart' show kDebugMode; import 'package:flutter/material.dart'; @@ -439,7 +440,7 @@ class LoginPageController extends GetxController onPressed: Get.back, child: Text( "取消", - style: TextStyle(color: Get.theme.colorScheme.outline), + style: TextStyle(color: ThemeUtils.theme.colorScheme.outline), ), ), TextButton( diff --git a/lib/pages/main/view.dart b/lib/pages/main/view.dart index 8dc194877..4d7e61d26 100644 --- a/lib/pages/main/view.dart +++ b/lib/pages/main/view.dart @@ -45,6 +45,7 @@ class _MainAppState extends PopScopeState final _mainController = Get.put(MainController()); late final _setting = GStorage.setting; late EdgeInsets _padding; + late ThemeData theme; @override bool get initCanPop => false; @@ -71,7 +72,8 @@ class _MainAppState extends PopScopeState void didChangeDependencies() { super.didChangeDependencies(); _padding = MediaQuery.viewPaddingOf(context); - final brightness = Theme.brightnessOf(context); + theme = Theme.of(context); + final brightness = theme.brightness; NetworkImgLayer.reduce = NetworkImgLayer.reduceLuxColor != null && brightness.isDark; if (PlatformUtils.isDesktop) { @@ -425,7 +427,6 @@ class _MainAppState extends PopScopeState @override Widget build(BuildContext context) { - final theme = Theme.of(context); Widget child; if (_mainController.mainTabBarView) { child = CustomTabBarView( diff --git a/lib/pages/member/controller.dart b/lib/pages/member/controller.dart index 1822bcebd..18d3c4b24 100644 --- a/lib/pages/member/controller.dart +++ b/lib/pages/member/controller.dart @@ -15,8 +15,8 @@ import 'package:PiliPlus/models_new/space/space/tab2.dart'; import 'package:PiliPlus/pages/common/common_data_controller.dart'; import 'package:PiliPlus/utils/accounts.dart'; import 'package:PiliPlus/utils/request_utils.dart'; +import 'package:PiliPlus/utils/share_utils.dart'; import 'package:PiliPlus/utils/storage_pref.dart'; -import 'package:PiliPlus/utils/utils.dart'; import 'package:extended_nested_scroll_view/extended_nested_scroll_view.dart' show ExtendedNestedScrollViewState; import 'package:flutter/material.dart'; @@ -201,7 +201,7 @@ class MemberController extends CommonDataController } void shareUser() { - Utils.shareText('https://space.bilibili.com/$mid'); + ShareUtils.shareText('https://space.bilibili.com/$mid'); } Future _onBlock() async { diff --git a/lib/pages/member/widget/medal_widget.dart b/lib/pages/member/widget/medal_widget.dart index 532179262..45b2ef9e4 100644 --- a/lib/pages/member/widget/medal_widget.dart +++ b/lib/pages/member/widget/medal_widget.dart @@ -1,6 +1,6 @@ import 'package:PiliPlus/common/style.dart'; import 'package:PiliPlus/models_new/live/live_medal_wall/uinfo_medal.dart'; -import 'package:PiliPlus/utils/utils.dart'; +import 'package:PiliPlus/utils/color_utils.dart'; import 'package:flutter/material.dart'; const _kFontSize = 10.0; @@ -27,8 +27,8 @@ class MedalWidget extends StatelessWidget { this.padding = _kPadding, }) : medalName = medal.name!, level = medal.level!, - backgroundColor = Utils.parseMedalColor(medal.v2MedalColorStart!), - nameColor = Utils.parseColor(medal.v2MedalColorText!); + backgroundColor = ColourUtils.parseMedalColor(medal.v2MedalColorStart!), + nameColor = ColourUtils.parseColor(medal.v2MedalColorText!); final String medalName; final int level; diff --git a/lib/pages/member/widget/user_info_card.dart b/lib/pages/member/widget/user_info_card.dart index 6736e0c95..5638a166e 100644 --- a/lib/pages/member/widget/user_info_card.dart +++ b/lib/pages/member/widget/user_info_card.dart @@ -24,6 +24,8 @@ import 'package:PiliPlus/pages/member_guard/view.dart'; import 'package:PiliPlus/pages/member_upower_rank/view.dart'; import 'package:PiliPlus/utils/accounts.dart'; import 'package:PiliPlus/utils/app_scheme.dart'; +import 'package:PiliPlus/utils/bili_utils.dart'; +import 'package:PiliPlus/utils/color_utils.dart'; import 'package:PiliPlus/utils/extension/context_ext.dart'; import 'package:PiliPlus/utils/extension/num_ext.dart'; import 'package:PiliPlus/utils/extension/string_ext.dart'; @@ -165,8 +167,8 @@ class UserInfoCard extends StatelessWidget { Color? nameColor; Color? backgroundColor; try { - nameColor = Utils.parseColor(detailV2.medalColorName!); - backgroundColor = Utils.parseColor(detailV2.medalColor!); + nameColor = ColourUtils.parseColor(detailV2.medalColorName!); + backgroundColor = ColourUtils.parseColor(detailV2.medalColor!); } catch (e, s) { if (kDebugMode) { Utils.reportError(e, s); @@ -216,7 +218,7 @@ class UserInfoCard extends StatelessWidget { ), ), Image.asset( - Utils.levelName( + BiliUtils.levelName( card.levelInfo!.currentLevel!, isSeniorMember: card.levelInfo?.identity == 2, ), @@ -714,7 +716,7 @@ class UserInfoCard extends StatelessWidget { bool isLight, SpacePrInfo prInfo, ) { - final textColor = Utils.parseColor( + final textColor = ColourUtils.parseColor( isLight ? prInfo.textColor : prInfo.textColorNight, ); String? icon = !isLight && prInfo.iconNight?.isNotEmpty == true @@ -726,7 +728,9 @@ class UserInfoCard extends StatelessWidget { Widget child = Container( margin: const .only(top: 8), padding: const .symmetric(horizontal: 16, vertical: 10), - color: Utils.parseColor(isLight ? prInfo.bgColor : prInfo.bgColorNight), + color: ColourUtils.parseColor( + isLight ? prInfo.bgColor : prInfo.bgColorNight, + ), child: Row( children: [ if (icon != null) ...[ @@ -1055,7 +1059,7 @@ class _HeaderTitleState extends State { fontSize: 12, fontFamily: Assets.digitalNum, color: title.subTitleColorFormat?.colors?.isNotEmpty == true - ? Utils.parseMedalColor( + ? ColourUtils.parseMedalColor( title.subTitleColorFormat!.colors!.last, ) : Colors.white, diff --git a/lib/pages/member_favorite/widget/item.dart b/lib/pages/member_favorite/widget/item.dart index 33f94627e..1c01e1454 100644 --- a/lib/pages/member_favorite/widget/item.dart +++ b/lib/pages/member_favorite/widget/item.dart @@ -5,7 +5,7 @@ import 'package:PiliPlus/common/widgets/image/image_save.dart'; import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; import 'package:PiliPlus/models_new/space/space_fav/list.dart'; import 'package:PiliPlus/pages/subscription_detail/view.dart'; -import 'package:PiliPlus/utils/fav_utils.dart'; +import 'package:PiliPlus/utils/bili_utils.dart'; import 'package:PiliPlus/utils/num_utils.dart'; import 'package:PiliPlus/utils/platform_utils.dart'; import 'package:PiliPlus/utils/utils.dart'; @@ -101,7 +101,7 @@ class MemberFavItem extends StatelessWidget { const Spacer(), Text( item.type == 0 - ? '${item.mediaCount}个内容 · ${FavUtils.isPublicFavText(item.attr)}' + ? '${item.mediaCount}个内容 · ${BiliUtils.isPublicFavText(item.attr)}' : item.type == 11 ? '${item.mediaCount}个内容 · ${item.upper?.name}' : item.type == 21 diff --git a/lib/pages/member_profile/view.dart b/lib/pages/member_profile/view.dart index fa4082b48..d8d8282e9 100644 --- a/lib/pages/member_profile/view.dart +++ b/lib/pages/member_profile/view.dart @@ -496,7 +496,7 @@ class _EditProfilePageState extends State { toolbarTitle: '裁剪', toolbarColor: theme.colorScheme.secondaryContainer, toolbarWidgetColor: theme.colorScheme.onSecondaryContainer, - statusBarLight: theme.colorScheme.isLight, + statusBarLight: theme.isLight, aspectRatioPresets: const [CropAspectRatioPresetCustom()], lockAspectRatio: true, hideBottomControls: true, diff --git a/lib/pages/member_video/controller.dart b/lib/pages/member_video/controller.dart index 9ed2bb834..e7d95fc06 100644 --- a/lib/pages/member_video/controller.dart +++ b/lib/pages/member_video/controller.dart @@ -10,10 +10,10 @@ import 'package:PiliPlus/models_new/space/space_archive/data.dart'; import 'package:PiliPlus/models_new/space/space_archive/episodic_button.dart'; import 'package:PiliPlus/models_new/space/space_archive/item.dart'; import 'package:PiliPlus/pages/common/common_list_controller.dart'; +import 'package:PiliPlus/utils/extension/dimension_ext.dart'; import 'package:PiliPlus/utils/extension/iterable_ext.dart'; import 'package:PiliPlus/utils/id_utils.dart'; import 'package:PiliPlus/utils/page_utils.dart'; -import 'package:PiliPlus/utils/utils.dart'; import 'package:get/get.dart'; class MemberVideoCtr @@ -195,7 +195,7 @@ class MemberVideoCtr : desc; bool isVertical = false; if (element.uri case final uri?) { - isVertical = Utils.getDimensionFromUri(uri); + isVertical = uri.isVerticalFromUri; } PageUtils.toVideoPage( bvid: element.bvid, diff --git a/lib/pages/member_video/widgets/video_card_h_member_video.dart b/lib/pages/member_video/widgets/video_card_h_member_video.dart index fe48040b6..27bb07164 100644 --- a/lib/pages/member_video/widgets/video_card_h_member_video.dart +++ b/lib/pages/member_video/widgets/video_card_h_member_video.dart @@ -11,9 +11,9 @@ import 'package:PiliPlus/models/common/stat_type.dart'; import 'package:PiliPlus/models_new/space/space_archive/item.dart'; import 'package:PiliPlus/utils/date_utils.dart'; import 'package:PiliPlus/utils/duration_utils.dart'; +import 'package:PiliPlus/utils/extension/dimension_ext.dart'; import 'package:PiliPlus/utils/page_utils.dart'; import 'package:PiliPlus/utils/platform_utils.dart'; -import 'package:PiliPlus/utils/utils.dart'; import 'package:flutter/material.dart' hide LayoutBuilder; // 视频卡片 - 水平布局 @@ -64,7 +64,7 @@ class VideoCardHMemberVideo extends StatelessWidget { } bool isVertical = false; if (videoItem.uri case final uri?) { - isVertical = Utils.getDimensionFromUri(uri); + isVertical = uri.isVerticalFromUri; } PageUtils.toVideoPage( bvid: videoItem.bvid, diff --git a/lib/pages/mine/controller.dart b/lib/pages/mine/controller.dart index aac352630..847895a63 100644 --- a/lib/pages/mine/controller.dart +++ b/lib/pages/mine/controller.dart @@ -15,6 +15,7 @@ import 'package:PiliPlus/utils/login_utils.dart'; import 'package:PiliPlus/utils/storage.dart'; import 'package:PiliPlus/utils/storage_key.dart'; import 'package:PiliPlus/utils/storage_pref.dart'; +import 'package:PiliPlus/utils/theme_utils.dart'; import 'package:flutter/material.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get.dart'; @@ -266,7 +267,7 @@ class MineController extends CommonDataController final newVal = nextThemeType; themeType.value = newVal; GStorage.setting.put(SettingBoxKey.themeMode, newVal.index); - Get.changeThemeMode(newVal.toThemeMode); + Get.changeThemeMode(ThemeUtils.themeMode = newVal.toThemeMode); } void push(String name) { diff --git a/lib/pages/mine/view.dart b/lib/pages/mine/view.dart index e133eb72a..38169fdea 100644 --- a/lib/pages/mine/view.dart +++ b/lib/pages/mine/view.dart @@ -14,6 +14,7 @@ import 'package:PiliPlus/pages/login/controller.dart'; import 'package:PiliPlus/pages/main/controller.dart'; import 'package:PiliPlus/pages/mine/controller.dart'; import 'package:PiliPlus/pages/mine/widgets/item.dart'; +import 'package:PiliPlus/utils/bili_utils.dart'; import 'package:PiliPlus/utils/extension/get_ext.dart'; import 'package:PiliPlus/utils/extension/num_ext.dart'; import 'package:PiliPlus/utils/extension/theme_ext.dart'; @@ -315,7 +316,7 @@ class _MediaPageState extends CommonPageState ), ), Image.asset( - Utils.levelName( + BiliUtils.levelName( levelInfo?.currentLevel ?? 0, isSeniorMember: userInfo.isSeniorMember == 1, ), diff --git a/lib/pages/mine/widgets/item.dart b/lib/pages/mine/widgets/item.dart index cc21dc10b..a06a4913c 100644 --- a/lib/pages/mine/widgets/item.dart +++ b/lib/pages/mine/widgets/item.dart @@ -1,6 +1,6 @@ import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; import 'package:PiliPlus/models_new/fav/fav_folder/list.dart'; -import 'package:PiliPlus/utils/fav_utils.dart'; +import 'package:PiliPlus/utils/bili_utils.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; @@ -64,7 +64,7 @@ class FavFolderItem extends StatelessWidget { maxLines: 1, ), Text( - ' 共${item.mediaCount}条视频 · ${FavUtils.isPublicFavText(item.attr)}', + ' 共${item.mediaCount}条视频 · ${BiliUtils.isPublicFavText(item.attr)}', style: theme.textTheme.labelSmall!.copyWith( color: theme.colorScheme.outline, ), diff --git a/lib/pages/music/view.dart b/lib/pages/music/view.dart index e637c6bfe..d41674f04 100644 --- a/lib/pages/music/view.dart +++ b/lib/pages/music/view.dart @@ -25,6 +25,7 @@ import 'package:PiliPlus/utils/extension/string_ext.dart'; import 'package:PiliPlus/utils/grid.dart'; import 'package:PiliPlus/utils/num_utils.dart'; import 'package:PiliPlus/utils/page_utils.dart'; +import 'package:PiliPlus/utils/share_utils.dart'; import 'package:PiliPlus/utils/utils.dart'; import 'package:fl_chart/fl_chart.dart'; import 'package:flutter/material.dart'; @@ -307,7 +308,8 @@ class _MusicDetailPageState extends CommonDynPageState { child: textIconButton( icon: CustomIcons.share_node, text: '分享', - onPressed: () => Utils.shareText(controller.shareUrl), + onPressed: () => + ShareUtils.shareText(controller.shareUrl), ), ), Expanded( diff --git a/lib/pages/pgc_review/child/view.dart b/lib/pages/pgc_review/child/view.dart index a8536acef..abe13db42 100644 --- a/lib/pages/pgc_review/child/view.dart +++ b/lib/pages/pgc_review/child/view.dart @@ -13,11 +13,11 @@ import 'package:PiliPlus/models_new/pgc/pgc_review/list.dart'; import 'package:PiliPlus/pages/pgc_review/child/controller.dart'; import 'package:PiliPlus/pages/pgc_review/post/view.dart'; import 'package:PiliPlus/utils/accounts.dart'; +import 'package:PiliPlus/utils/bili_utils.dart'; import 'package:PiliPlus/utils/extension/num_ext.dart'; import 'package:PiliPlus/utils/extension/theme_ext.dart'; import 'package:PiliPlus/utils/num_utils.dart'; import 'package:PiliPlus/utils/platform_utils.dart'; -import 'package:PiliPlus/utils/utils.dart'; import 'package:flutter/material.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:get/get.dart'; @@ -245,7 +245,7 @@ class _PgcReviewChildPageState extends State ), ), Image.asset( - Utils.levelName(item.author!.level!), + BiliUtils.levelName(item.author!.level!), height: 11, cacheHeight: 11.cacheSize(context), ), diff --git a/lib/pages/pgc_review/view.dart b/lib/pages/pgc_review/view.dart index 1b3446a34..3d23873d2 100644 --- a/lib/pages/pgc_review/view.dart +++ b/lib/pages/pgc_review/view.dart @@ -154,7 +154,7 @@ class _PgcReviewPageState extends State '/webview', parameters: { 'url': - 'https://member.bilibili.com/article-text/mobile?theme=${theme.brightness.isDark ? 1 : 0}&media_id=${widget.mediaId}', + 'https://member.bilibili.com/article-text/mobile?theme=${theme.isDark ? 1 : 0}&media_id=${widget.mediaId}', }, ), ), diff --git a/lib/pages/save_panel/view.dart b/lib/pages/save_panel/view.dart index 2a80e4526..ec485597f 100644 --- a/lib/pages/save_panel/view.dart +++ b/lib/pages/save_panel/view.dart @@ -19,6 +19,7 @@ import 'package:PiliPlus/utils/extension/num_ext.dart'; import 'package:PiliPlus/utils/extension/theme_ext.dart'; import 'package:PiliPlus/utils/image_utils.dart'; import 'package:PiliPlus/utils/platform_utils.dart'; +import 'package:PiliPlus/utils/share_utils.dart'; import 'package:PiliPlus/utils/utils.dart'; import 'package:flutter/foundation.dart' show kDebugMode; import 'package:flutter/material.dart'; @@ -312,7 +313,7 @@ class _SavePanelState extends State { mimeType: 'image/png', ), ], - sharePositionOrigin: await Utils.sharePositionOrigin, + sharePositionOrigin: await ShareUtils.sharePositionOrigin, ), ); } else { @@ -490,7 +491,7 @@ class _SavePanelState extends State { height: 88, margin: const .all(12), padding: const .all(3), - color: theme.brightness.isDark + color: theme.isDark ? Colors.white : theme.colorScheme.surface, child: PrettyQrView.data( diff --git a/lib/pages/search_panel/user/widgets/item.dart b/lib/pages/search_panel/user/widgets/item.dart index 97e0a86df..fdb45feeb 100644 --- a/lib/pages/search_panel/user/widgets/item.dart +++ b/lib/pages/search_panel/user/widgets/item.dart @@ -1,8 +1,8 @@ import 'package:PiliPlus/common/widgets/pendant_avatar.dart'; import 'package:PiliPlus/models/search/result.dart'; +import 'package:PiliPlus/utils/bili_utils.dart'; import 'package:PiliPlus/utils/extension/num_ext.dart'; import 'package:PiliPlus/utils/num_utils.dart'; -import 'package:PiliPlus/utils/utils.dart'; import 'package:flutter/material.dart'; import 'package:get/get_core/src/get_main.dart'; import 'package:get/get_navigation/src/extension_navigation.dart'; @@ -53,7 +53,7 @@ class SearchUserItem extends StatelessWidget { ), const SizedBox(width: 6), Image.asset( - Utils.levelName( + BiliUtils.levelName( item.level!, isSeniorMember: item.isSeniorMember == 1, ), diff --git a/lib/pages/search_trending/view.dart b/lib/pages/search_trending/view.dart index d55756671..5170490e5 100644 --- a/lib/pages/search_trending/view.dart +++ b/lib/pages/search_trending/view.dart @@ -8,12 +8,12 @@ import 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart'; import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/models_new/search/search_trending/list.dart'; import 'package:PiliPlus/pages/search_trending/controller.dart'; +import 'package:PiliPlus/utils/color_utils.dart'; import 'package:PiliPlus/utils/extension/context_ext.dart'; import 'package:PiliPlus/utils/extension/get_ext.dart'; import 'package:PiliPlus/utils/extension/num_ext.dart'; import 'package:PiliPlus/utils/extension/size_ext.dart'; import 'package:PiliPlus/utils/image_utils.dart'; -import 'package:PiliPlus/utils/utils.dart'; import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart' hide ListTile; @@ -181,7 +181,7 @@ class _SearchTrendingPageState extends State { '${index + 1 - _controller.topCount}', style: TextStyle( fontWeight: FontWeight.bold, - color: Utils.index2Color( + color: ColourUtils.index2Color( index - _controller.topCount, theme.colorScheme.outline, ), diff --git a/lib/pages/setting/models/style_settings.dart b/lib/pages/setting/models/style_settings.dart index 45bdf2826..d44e918fa 100644 --- a/lib/pages/setting/models/style_settings.dart +++ b/lib/pages/setting/models/style_settings.dart @@ -7,7 +7,6 @@ import 'package:PiliPlus/common/widgets/dialog/dialog.dart'; import 'package:PiliPlus/common/widgets/image/network_img_layer.dart'; import 'package:PiliPlus/common/widgets/scale_app.dart'; import 'package:PiliPlus/common/widgets/stateful_builder.dart'; -import 'package:PiliPlus/main.dart'; import 'package:PiliPlus/models/common/bar_hide_type.dart'; import 'package:PiliPlus/models/common/dynamic/dynamic_badge_mode.dart'; import 'package:PiliPlus/models/common/dynamic/up_panel_position.dart'; @@ -35,6 +34,7 @@ import 'package:PiliPlus/utils/platform_utils.dart'; import 'package:PiliPlus/utils/storage.dart'; import 'package:PiliPlus/utils/storage_key.dart'; import 'package:PiliPlus/utils/storage_pref.dart'; +import 'package:PiliPlus/utils/theme_utils.dart'; import 'package:flutter/material.dart' hide StatefulBuilder; import 'package:flutter/services.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; @@ -142,16 +142,11 @@ List get styleSettings => [ setKey: SettingBoxKey.removeSafeArea, defaultVal: false, ), - SwitchModel( + const SwitchModel( title: '视频播放页使用深色主题', - leading: const Icon(Icons.dark_mode_outlined), + leading: Icon(Icons.dark_mode_outlined), setKey: SettingBoxKey.darkVideoPage, defaultVal: false, - onChanged: (value) { - if (value && MyApp.darkThemeData == null) { - Get.updateMyAppTheme(); - } - }, ), SwitchModel( title: '动态页启用瀑布流', @@ -295,7 +290,7 @@ List get styleSettings => [ setKey: SettingBoxKey.isPureBlackTheme, defaultVal: false, onChanged: (value) { - if (Get.isDarkMode || Pref.darkVideoPage) { + if (ThemeUtils.isDarkMode || Pref.darkVideoPage) { Get.updateMyAppTheme(); } }, @@ -890,7 +885,7 @@ Future _showThemeTypeDialog( Get.find().themeType.value = res; } catch (_) {} GStorage.setting.put(SettingBoxKey.themeMode, res.index); - Get.changeThemeMode(res.toThemeMode); + Get.changeThemeMode(ThemeUtils.themeMode = res.toThemeMode); setState(); } } diff --git a/lib/pages/setting/pages/color_select.dart b/lib/pages/setting/pages/color_select.dart index 3bb7476bf..6aa14fe3b 100644 --- a/lib/pages/setting/pages/color_select.dart +++ b/lib/pages/setting/pages/color_select.dart @@ -14,6 +14,7 @@ import 'package:PiliPlus/utils/extension/theme_ext.dart'; import 'package:PiliPlus/utils/storage.dart'; import 'package:PiliPlus/utils/storage_key.dart'; import 'package:PiliPlus/utils/storage_pref.dart'; +import 'package:PiliPlus/utils/theme_utils.dart'; import 'package:flex_seed_scheme/flex_seed_scheme.dart'; import 'package:flutter/material.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; @@ -85,7 +86,7 @@ class _ColorSelectPageState extends State { } catch (_) {} ctr.themeType.value = result; GStorage.setting.put(SettingBoxKey.themeMode, result.index); - Get.changeThemeMode(result.toThemeMode); + Get.changeThemeMode(ThemeUtils.themeMode = result.toThemeMode); } }, leading: const Icon(Icons.flashlight_on_outlined), diff --git a/lib/pages/video/controller.dart b/lib/pages/video/controller.dart index a4c5898a5..f3a55b502 100644 --- a/lib/pages/video/controller.dart +++ b/lib/pages/video/controller.dart @@ -13,7 +13,6 @@ import 'package:PiliPlus/http/init.dart'; import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/http/user.dart'; import 'package:PiliPlus/http/video.dart'; -import 'package:PiliPlus/main.dart'; import 'package:PiliPlus/models/common/account_type.dart'; import 'package:PiliPlus/models/common/sponsor_block/action_type.dart'; import 'package:PiliPlus/models/common/sponsor_block/post_segment_model.dart'; @@ -53,6 +52,7 @@ import 'package:PiliPlus/plugin/pl_player/models/heart_beat_type.dart'; import 'package:PiliPlus/plugin/pl_player/models/play_status.dart'; import 'package:PiliPlus/services/download/download_service.dart'; import 'package:PiliPlus/utils/accounts.dart'; +import 'package:PiliPlus/utils/connectivity_utils.dart'; import 'package:PiliPlus/utils/extension/context_ext.dart'; import 'package:PiliPlus/utils/extension/file_ext.dart'; import 'package:PiliPlus/utils/extension/iterable_ext.dart'; @@ -63,6 +63,7 @@ import 'package:PiliPlus/utils/path_utils.dart'; import 'package:PiliPlus/utils/platform_utils.dart'; import 'package:PiliPlus/utils/storage.dart'; import 'package:PiliPlus/utils/storage_pref.dart'; +import 'package:PiliPlus/utils/theme_utils.dart'; import 'package:PiliPlus/utils/utils.dart'; import 'package:PiliPlus/utils/video_utils.dart'; import 'package:extended_nested_scroll_view/extended_nested_scroll_view.dart'; @@ -523,11 +524,8 @@ class VideoDetailController extends GetxController if (plPlayerController.isFullScreen.value || showVideoSheet) { PageUtils.showVideoBottomSheet( context, - child: plPlayerController.darkVideoPage && MyApp.darkThemeData != null - ? Theme( - data: MyApp.darkThemeData!, - child: panel(), - ) + child: plPlayerController.darkVideoPage + ? Theme(data: ThemeUtils.darkTheme, child: panel()) : panel(), isFullScreen: () => plPlayerController.isFullScreen.value, ); @@ -574,7 +572,7 @@ class VideoDetailController extends GetxController @override Widget buildItem(Object item, Animation animation) { - final theme = Get.theme; + final theme = ThemeUtils.theme; return Align( alignment: Alignment.centerLeft, child: SlideTransition( @@ -838,7 +836,7 @@ class VideoDetailController extends GetxController querySponsorBlock(bvid: bvid, cid: cid.value); } if (plPlayerController.cacheVideoQa == null) { - final isWiFi = await Utils.isWiFi; + final isWiFi = await ConnectivityUtils.isWiFi; plPlayerController ..cacheVideoQa = isWiFi ? Pref.defaultVideoQa @@ -1031,9 +1029,9 @@ class VideoDetailController extends GetxController if (plPlayerController.isFullScreen.value || showVideoSheet) { PageUtils.showVideoBottomSheet( context, - child: plPlayerController.darkVideoPage && MyApp.darkThemeData != null + child: plPlayerController.darkVideoPage ? Theme( - data: MyApp.darkThemeData!, + data: ThemeUtils.darkTheme, child: PostPanel( enableSlide: false, videoDetailController: this, @@ -1370,9 +1368,9 @@ class VideoDetailController extends GetxController if (plPlayerController.isFullScreen.value || showVideoSheet) { PageUtils.showVideoBottomSheet( context, - child: plPlayerController.darkVideoPage && MyApp.darkThemeData != null + child: plPlayerController.darkVideoPage ? Theme( - data: MyApp.darkThemeData!, + data: ThemeUtils.darkTheme, child: NoteListPage( oid: aid, enableSlide: false, diff --git a/lib/pages/video/introduction/pgc/controller.dart b/lib/pages/video/introduction/pgc/controller.dart index 6426cc5f9..7c8781366 100644 --- a/lib/pages/video/introduction/pgc/controller.dart +++ b/lib/pages/video/introduction/pgc/controller.dart @@ -26,6 +26,7 @@ import 'package:PiliPlus/utils/global_data.dart'; import 'package:PiliPlus/utils/id_utils.dart'; import 'package:PiliPlus/utils/page_utils.dart'; import 'package:PiliPlus/utils/platform_utils.dart'; +import 'package:PiliPlus/utils/share_utils.dart'; import 'package:PiliPlus/utils/utils.dart'; import 'package:flutter/foundation.dart' show kDebugMode; import 'package:flutter/material.dart'; @@ -181,7 +182,7 @@ class PgcIntroController extends CommonIntroController { ), onTap: () { Get.back(); - Utils.shareText(videoUrl); + ShareUtils.shareText(videoUrl); }, ), ListTile( diff --git a/lib/pages/video/introduction/ugc/controller.dart b/lib/pages/video/introduction/ugc/controller.dart index 866caeb2f..ab097e7c6 100644 --- a/lib/pages/video/introduction/ugc/controller.dart +++ b/lib/pages/video/introduction/ugc/controller.dart @@ -30,7 +30,8 @@ import 'package:PiliPlus/pages/video/reply/controller.dart'; import 'package:PiliPlus/plugin/pl_player/models/play_repeat.dart'; import 'package:PiliPlus/services/service_locator.dart'; import 'package:PiliPlus/utils/accounts.dart'; -import 'package:PiliPlus/utils/extension/context_ext.dart'; +import 'package:PiliPlus/utils/device_utils.dart'; +import 'package:PiliPlus/utils/extension/size_ext.dart'; import 'package:PiliPlus/utils/extension/string_ext.dart'; import 'package:PiliPlus/utils/feed_back.dart'; import 'package:PiliPlus/utils/global_data.dart'; @@ -38,6 +39,7 @@ import 'package:PiliPlus/utils/id_utils.dart'; import 'package:PiliPlus/utils/page_utils.dart'; import 'package:PiliPlus/utils/platform_utils.dart'; import 'package:PiliPlus/utils/request_utils.dart'; +import 'package:PiliPlus/utils/share_utils.dart'; import 'package:PiliPlus/utils/storage_pref.dart'; import 'package:PiliPlus/utils/utils.dart'; import 'package:expandable/expandable.dart'; @@ -77,7 +79,7 @@ class UgcIntroController extends CommonIntroController with ReloadMixin { ); if (!alwaysExpandIntroPanel && Pref.expandIntroPanelH) { WidgetsBinding.instance.addPostFrameCallback((_) { - if (!expandableCtr.expanded && Get.context!.isLandscape) { + if (!expandableCtr.expanded && !DeviceUtils.size.isPortrait) { expandableCtr.toggle(); } }); @@ -361,7 +363,7 @@ class UgcIntroController extends CommonIntroController with ReloadMixin { ), onTap: () { Get.back(); - Utils.shareText( + ShareUtils.shareText( '${videoDetail.title} ' 'UP主: ${videoDetail.owner!.name!}' ' - $videoUrl', diff --git a/lib/pages/video/member/view.dart b/lib/pages/video/member/view.dart index 8816a62e3..0893c101e 100644 --- a/lib/pages/video/member/view.dart +++ b/lib/pages/video/member/view.dart @@ -19,6 +19,7 @@ import 'package:PiliPlus/pages/video/controller.dart'; import 'package:PiliPlus/pages/video/introduction/ugc/controller.dart'; import 'package:PiliPlus/pages/video/member/controller.dart'; import 'package:PiliPlus/utils/accounts.dart'; +import 'package:PiliPlus/utils/bili_utils.dart'; import 'package:PiliPlus/utils/extension/num_ext.dart'; import 'package:PiliPlus/utils/extension/theme_ext.dart'; import 'package:PiliPlus/utils/num_utils.dart'; @@ -257,7 +258,7 @@ class _HorizontalMemberPageState extends State { ), const SizedBox(width: 8), Image.asset( - Utils.levelName( + BiliUtils.levelName( memberInfoModel.level!, isSeniorMember: memberInfoModel.isSeniorMember == 1, ), diff --git a/lib/pages/video/note/view.dart b/lib/pages/video/note/view.dart index f8ac82f27..cdd3c97ca 100644 --- a/lib/pages/video/note/view.dart +++ b/lib/pages/video/note/view.dart @@ -9,9 +9,9 @@ import 'package:PiliPlus/pages/common/slide/common_slide_page.dart'; import 'package:PiliPlus/pages/video/note/controller.dart'; import 'package:PiliPlus/pages/webview/view.dart'; import 'package:PiliPlus/utils/accounts.dart'; +import 'package:PiliPlus/utils/bili_utils.dart'; import 'package:PiliPlus/utils/extension/num_ext.dart'; import 'package:PiliPlus/utils/extension/theme_ext.dart'; -import 'package:PiliPlus/utils/utils.dart'; import 'package:extended_nested_scroll_view/extended_nested_scroll_view.dart'; import 'package:flutter/material.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; @@ -264,7 +264,7 @@ class _NoteListPageState extends State ), const SizedBox(width: 6), Image.asset( - Utils.levelName( + BiliUtils.levelName( item.author!.level!, isSeniorMember: item.author!.isSeniorMember == 1, ), diff --git a/lib/pages/video/reply/widgets/reply_item_grpc.dart b/lib/pages/video/reply/widgets/reply_item_grpc.dart index 321f80cf4..caf63b146 100644 --- a/lib/pages/video/reply/widgets/reply_item_grpc.dart +++ b/lib/pages/video/reply/widgets/reply_item_grpc.dart @@ -27,6 +27,8 @@ import 'package:PiliPlus/pages/video/controller.dart'; import 'package:PiliPlus/pages/video/reply/widgets/zan_grpc.dart'; import 'package:PiliPlus/utils/accounts.dart'; import 'package:PiliPlus/utils/app_scheme.dart'; +import 'package:PiliPlus/utils/bili_utils.dart'; +import 'package:PiliPlus/utils/color_utils.dart'; import 'package:PiliPlus/utils/danmaku_utils.dart'; import 'package:PiliPlus/utils/date_utils.dart'; import 'package:PiliPlus/utils/duration_utils.dart'; @@ -182,7 +184,7 @@ class ReplyItemGrpc extends StatelessWidget { ), ), Image.asset( - Utils.levelName( + BiliUtils.levelName( member.level, isSeniorMember: member.isSeniorMember == 1, ), @@ -277,7 +279,7 @@ class ReplyItemGrpc extends StatelessWidget { style: TextStyle( fontSize: 8, fontFamily: Assets.digitalNum, - color: Utils.parseColor(garb.cardFanColor), + color: ColourUtils.parseColor(garb.cardFanColor), ), ), ), diff --git a/lib/pages/video/reply_new/view.dart b/lib/pages/video/reply_new/view.dart index fb7eb485e..875b486d8 100644 --- a/lib/pages/video/reply_new/view.dart +++ b/lib/pages/video/reply_new/view.dart @@ -11,7 +11,6 @@ import 'package:PiliPlus/grpc/bilibili/main/community/reply/v1.pb.dart' show ReplyInfo; import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/http/video.dart'; -import 'package:PiliPlus/main.dart'; import 'package:PiliPlus/models/common/publish_panel_type.dart'; import 'package:PiliPlus/models/dynamics/result.dart' show FilePicModel; import 'package:PiliPlus/pages/common/publish/common_rich_text_pub_page.dart'; @@ -25,6 +24,7 @@ import 'package:PiliPlus/utils/extension/context_ext.dart'; import 'package:PiliPlus/utils/grid.dart'; import 'package:PiliPlus/utils/path_utils.dart'; import 'package:PiliPlus/utils/storage_pref.dart'; +import 'package:PiliPlus/utils/theme_utils.dart'; import 'package:PiliPlus/utils/utils.dart'; import 'package:flutter/material.dart' hide TextField; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; @@ -72,9 +72,7 @@ class _ReplyPageState extends CommonRichTextPubPageState { @override void didChangeDependencies() { super.didChangeDependencies(); - themeData = darkVideoPage - ? MyApp.darkThemeData ?? Theme.of(context) - : Theme.of(context); + themeData = darkVideoPage ? ThemeUtils.darkTheme : Theme.of(context); } late final darkVideoPage = diff --git a/lib/pages/video/send_danmaku/view.dart b/lib/pages/video/send_danmaku/view.dart index 68018e228..d987bfe82 100644 --- a/lib/pages/video/send_danmaku/view.dart +++ b/lib/pages/video/send_danmaku/view.dart @@ -4,13 +4,13 @@ import 'package:PiliPlus/common/widgets/button/icon_button.dart'; import 'package:PiliPlus/common/widgets/view_safe_area.dart'; import 'package:PiliPlus/http/danmaku.dart'; import 'package:PiliPlus/http/loading_state.dart'; -import 'package:PiliPlus/main.dart'; import 'package:PiliPlus/models/common/publish_panel_type.dart'; import 'package:PiliPlus/pages/common/publish/common_text_pub_page.dart'; import 'package:PiliPlus/pages/danmaku/danmaku_model.dart'; import 'package:PiliPlus/pages/setting/slide_color_picker.dart'; import 'package:PiliPlus/plugin/pl_player/controller.dart'; import 'package:PiliPlus/utils/storage_pref.dart'; +import 'package:PiliPlus/utils/theme_utils.dart'; import 'package:canvas_danmaku/models/danmaku_content_item.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart' show LengthLimitingTextInputFormatter; @@ -138,9 +138,7 @@ class _SendDanmakuPanelState extends CommonTextPubPageState { @override void didChangeDependencies() { super.didChangeDependencies(); - themeData = widget.darkVideoPage - ? MyApp.darkThemeData ?? Theme.of(context) - : Theme.of(context); + themeData = widget.darkVideoPage ? ThemeUtils.darkTheme : Theme.of(context); } late ThemeData themeData; diff --git a/lib/pages/video/view.dart b/lib/pages/video/view.dart index ebea9a417..5b6b5b86a 100644 --- a/lib/pages/video/view.dart +++ b/lib/pages/video/view.dart @@ -12,7 +12,6 @@ import 'package:PiliPlus/common/widgets/keep_alive_wrapper.dart'; import 'package:PiliPlus/common/widgets/route_aware_mixin.dart'; import 'package:PiliPlus/common/widgets/scroll_physics.dart'; import 'package:PiliPlus/common/widgets/sliver/sliver_pinned_dynamic_header.dart'; -import 'package:PiliPlus/main.dart'; import 'package:PiliPlus/models/common/episode_panel_type.dart'; import 'package:PiliPlus/models_new/pgc/pgc_info_model/result.dart'; import 'package:PiliPlus/models_new/video/video_detail/episode.dart' as ugc; @@ -61,6 +60,7 @@ import 'package:PiliPlus/utils/num_utils.dart'; import 'package:PiliPlus/utils/page_utils.dart'; import 'package:PiliPlus/utils/storage.dart'; import 'package:PiliPlus/utils/storage_key.dart'; +import 'package:PiliPlus/utils/theme_utils.dart'; import 'package:extended_nested_scroll_view/extended_nested_scroll_view.dart'; import 'package:floating/floating.dart'; import 'package:flutter/foundation.dart' show kDebugMode; @@ -472,7 +472,7 @@ class _VideoDetailPageVState extends State : minVideoHeight; themeData = videoDetailController.plPlayerController.darkVideoPage - ? MyApp.darkThemeData ?? Theme.of(context) + ? ThemeUtils.darkTheme : Theme.of(context); } diff --git a/lib/pages/video/widgets/header_control.dart b/lib/pages/video/widgets/header_control.dart index bd615448e..a666c6bd9 100644 --- a/lib/pages/video/widgets/header_control.dart +++ b/lib/pages/video/widgets/header_control.dart @@ -40,6 +40,7 @@ import 'package:PiliPlus/services/shutdown_timer_service.dart' show shutdownTimerService; import 'package:PiliPlus/utils/accounts.dart'; import 'package:PiliPlus/utils/accounts/account.dart'; +import 'package:PiliPlus/utils/connectivity_utils.dart'; import 'package:PiliPlus/utils/extension/iterable_ext.dart'; import 'package:PiliPlus/utils/extension/num_ext.dart'; import 'package:PiliPlus/utils/extension/string_ext.dart'; @@ -49,6 +50,7 @@ import 'package:PiliPlus/utils/platform_utils.dart'; import 'package:PiliPlus/utils/storage.dart'; import 'package:PiliPlus/utils/storage_key.dart'; import 'package:PiliPlus/utils/storage_pref.dart'; +import 'package:PiliPlus/utils/storage_utils.dart'; import 'package:PiliPlus/utils/utils.dart'; import 'package:PiliPlus/utils/video_utils.dart'; import 'package:battery_plus/battery_plus.dart'; @@ -979,7 +981,7 @@ class HeaderControlState extends State // update if (!plPlayerController.tempPlayerConf) { setting.put( - await Utils.isWiFi + await ConnectivityUtils.isWiFi ? SettingBoxKey.defaultVideoQa : SettingBoxKey.defaultVideoQaCellular, quality, @@ -1059,7 +1061,7 @@ class HeaderControlState extends State // update if (!plPlayerController.tempPlayerConf) { setting.put( - await Utils.isWiFi + await ConnectivityUtils.isWiFi ? SettingBoxKey.defaultAudioQa : SettingBoxKey.defaultAudioQaCellular, quality, @@ -1213,7 +1215,7 @@ class HeaderControlState extends State '', ); } - Utils.saveBytes2File( + StorageUtils.saveBytes2File( name: name, bytes: bytes, allowedExtensions: const ['json'], diff --git a/lib/pages/webdav/webdav.dart b/lib/pages/webdav/webdav.dart index 4a5e6aada..bd05361b7 100644 --- a/lib/pages/webdav/webdav.dart +++ b/lib/pages/webdav/webdav.dart @@ -2,12 +2,10 @@ import 'dart:convert'; import 'package:PiliPlus/common/constants.dart'; import 'package:PiliPlus/common/widgets/pair.dart'; -import 'package:PiliPlus/utils/extension/context_ext.dart'; +import 'package:PiliPlus/utils/device_utils.dart'; import 'package:PiliPlus/utils/storage.dart'; import 'package:PiliPlus/utils/storage_pref.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; -import 'package:get/get_core/src/get_main.dart'; -import 'package:get/get_navigation/src/extension_navigation.dart'; import 'package:webdav_client/webdav_client.dart' as webdav; class WebDav { @@ -53,7 +51,7 @@ class WebDav { } String _getFileName() { - return 'piliplus_settings_${Get.context!.platformName}.json'; + return 'piliplus_settings_${DeviceUtils.platformName}.json'; } Future backup() async { diff --git a/lib/pages/whisper/view.dart b/lib/pages/whisper/view.dart index 04e8fa987..5a1ea50df 100644 --- a/lib/pages/whisper/view.dart +++ b/lib/pages/whisper/view.dart @@ -7,7 +7,7 @@ import 'package:PiliPlus/pages/whisper/controller.dart'; import 'package:PiliPlus/pages/whisper/widgets/item.dart'; import 'package:PiliPlus/utils/extension/theme_ext.dart'; import 'package:PiliPlus/utils/extension/three_dot_ext.dart'; -import 'package:PiliPlus/utils/utils.dart'; +import 'package:PiliPlus/utils/theme_utils.dart'; import 'package:flutter/material.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get.dart'; @@ -37,7 +37,7 @@ class _WhisperPageState extends State { '/webview', parameters: { 'url': - 'https://www.bilibili.com/h5/follow/newFans?navhide=1&${Utils.themeUrl(theme.colorScheme.isDark)}', + 'https://www.bilibili.com/h5/follow/newFans?navhide=1&${ThemeUtils.themeUrl(theme.isDark)}', }, ), icon: const Icon(Icons.account_circle_outlined), diff --git a/lib/pages/whisper/widgets/item.dart b/lib/pages/whisper/widgets/item.dart index 86c5ad654..cb0b1c265 100644 --- a/lib/pages/whisper/widgets/item.dart +++ b/lib/pages/whisper/widgets/item.dart @@ -51,7 +51,7 @@ class WhisperSessionItem extends StatelessWidget { safeArea: true, tileColor: item.isPinned ? theme.colorScheme.onInverseSurface.withValues( - alpha: theme.brightness.isDark ? 0.4 : 0.8, + alpha: theme.isDark ? 0.4 : 0.8, ) : null, onLongPress: () => showDialog( diff --git a/lib/plugin/pl_player/controller.dart b/lib/plugin/pl_player/controller.dart index 7e902ab47..4b92e21e8 100644 --- a/lib/plugin/pl_player/controller.dart +++ b/lib/plugin/pl_player/controller.dart @@ -31,6 +31,7 @@ import 'package:PiliPlus/plugin/pl_player/utils/fullscreen.dart'; import 'package:PiliPlus/services/service_locator.dart'; import 'package:PiliPlus/utils/accounts.dart'; import 'package:PiliPlus/utils/asset_utils.dart'; +import 'package:PiliPlus/utils/device_utils.dart'; import 'package:PiliPlus/utils/extension/box_ext.dart'; import 'package:PiliPlus/utils/extension/num_ext.dart'; import 'package:PiliPlus/utils/feed_back.dart'; @@ -41,6 +42,7 @@ import 'package:PiliPlus/utils/platform_utils.dart'; import 'package:PiliPlus/utils/storage.dart'; import 'package:PiliPlus/utils/storage_key.dart'; import 'package:PiliPlus/utils/storage_pref.dart'; +import 'package:PiliPlus/utils/theme_utils.dart'; import 'package:PiliPlus/utils/utils.dart'; import 'package:archive/archive.dart' show getCrc32; import 'package:canvas_danmaku/canvas_danmaku.dart'; @@ -576,7 +578,7 @@ class PlPlayerController with BlockConfigMixin { } if (Platform.isAndroid && autoPiP) { - if (Utils.sdkInt < 36) { + if (DeviceUtils.sdkInt < 36) { Utils.channel.setMethodCallHandler((call) async { if (call.method == 'onUserLeaveHint') { if (playerStatus.isPlaying && _isCurrVideoPage) { @@ -1758,13 +1760,13 @@ class PlPlayerController with BlockConfigMixin { padding: const EdgeInsets.only(right: 12), child: ConstrainedBox( constraints: BoxConstraints( - maxWidth: min(Get.width / 3, 350), + maxWidth: min(DeviceUtils.size.width / 3, 350), ), child: DecoratedBox( decoration: BoxDecoration( border: Border.all( width: 5, - color: Get.theme.colorScheme.surface, + color: ThemeUtils.theme.colorScheme.surface, ), ), child: Padding( diff --git a/lib/plugin/pl_player/utils/fullscreen.dart b/lib/plugin/pl_player/utils/fullscreen.dart index a04c4a82a..15783f449 100644 --- a/lib/plugin/pl_player/utils/fullscreen.dart +++ b/lib/plugin/pl_player/utils/fullscreen.dart @@ -1,7 +1,7 @@ import 'dart:async'; import 'dart:io' show Platform; -import 'package:PiliPlus/utils/utils.dart'; +import 'package:PiliPlus/utils/device_utils.dart'; import 'package:flutter/services.dart' show SystemChrome, MethodChannel, SystemUiOverlay, DeviceOrientation; @@ -79,7 +79,7 @@ Future? showSystemBar() { } _showSystemBar = true; return SystemChrome.setEnabledSystemUIMode( - Platform.isAndroid && Utils.sdkInt < 29 ? .manual : .edgeToEdge, + Platform.isAndroid && DeviceUtils.sdkInt < 29 ? .manual : .edgeToEdge, overlays: SystemUiOverlay.values, ); } diff --git a/lib/plugin/pl_player/view/view.dart b/lib/plugin/pl_player/view/view.dart index 3de04686c..7674430b6 100644 --- a/lib/plugin/pl_player/view/view.dart +++ b/lib/plugin/pl_player/view/view.dart @@ -51,6 +51,7 @@ import 'package:PiliPlus/plugin/pl_player/widgets/common_btn.dart'; import 'package:PiliPlus/plugin/pl_player/widgets/forward_seek.dart'; import 'package:PiliPlus/plugin/pl_player/widgets/mpv_convert_webp.dart'; import 'package:PiliPlus/plugin/pl_player/widgets/play_pause_btn.dart'; +import 'package:PiliPlus/utils/connectivity_utils.dart'; import 'package:PiliPlus/utils/duration_utils.dart'; import 'package:PiliPlus/utils/extension/num_ext.dart'; import 'package:PiliPlus/utils/extension/theme_ext.dart'; @@ -822,7 +823,7 @@ class _PLVideoPlayerState extends State // update if (!plPlayerController.tempPlayerConf) { GStorage.setting.put( - await Utils.isWiFi + await ConnectivityUtils.isWiFi ? SettingBoxKey.defaultVideoQa : SettingBoxKey.defaultVideoQaCellular, quality, diff --git a/lib/utils/app_sign.dart b/lib/utils/app_sign.dart index 9a3162389..c7ebb873f 100644 --- a/lib/utils/app_sign.dart +++ b/lib/utils/app_sign.dart @@ -1,4 +1,4 @@ -import 'dart:convert'; +import 'dart:convert' show utf8; import 'package:PiliPlus/common/constants.dart'; import 'package:crypto/crypto.dart'; diff --git a/lib/utils/asset_utils.dart b/lib/utils/asset_utils.dart index 9d17a8ff5..aa210797a 100644 --- a/lib/utils/asset_utils.dart +++ b/lib/utils/asset_utils.dart @@ -1,7 +1,7 @@ -import 'dart:async'; -import 'dart:io'; +import 'dart:async' show FutureOr; +import 'dart:io' show Platform, Directory, File; -import 'package:flutter/services.dart'; +import 'package:flutter/services.dart' show rootBundle; import 'package:path/path.dart' as path; abstract final class AssetUtils { diff --git a/lib/utils/fav_utils.dart b/lib/utils/bili_utils.dart similarity index 53% rename from lib/utils/fav_utils.dart rename to lib/utils/bili_utils.dart index c01318181..96779e859 100644 --- a/lib/utils/fav_utils.dart +++ b/lib/utils/bili_utils.dart @@ -1,4 +1,4 @@ -abstract final class FavUtils { +abstract final class BiliUtils { static bool isDefaultFav(int? attr) { if (attr == null) { return false; @@ -16,4 +16,13 @@ abstract final class FavUtils { static bool isPublicFav(int attr) { return (attr & 1) == 0; } + + static bool isCustomFollowTag(int? tagid) { + return tagid != null && tagid != 0 && tagid != -10 && tagid != -2; + } + + static String levelName( + Object level, { + bool isSeniorMember = false, + }) => 'assets/images/lv/lv${isSeniorMember ? '6_s' : level}.png'; } diff --git a/lib/utils/cache_manager.dart b/lib/utils/cache_manager.dart index 4dc29623c..05e5c90e7 100644 --- a/lib/utils/cache_manager.dart +++ b/lib/utils/cache_manager.dart @@ -1,5 +1,4 @@ -import 'dart:async'; -import 'dart:io'; +import 'dart:io' show Directory, File; import 'package:PiliPlus/utils/platform_utils.dart'; import 'package:PiliPlus/utils/storage_pref.dart'; diff --git a/lib/utils/calc_window_position.dart b/lib/utils/calc_window_position.dart index 1544ce6e5..3e6de9382 100644 --- a/lib/utils/calc_window_position.dart +++ b/lib/utils/calc_window_position.dart @@ -1,6 +1,6 @@ +import 'package:PiliPlus/utils/extension/iterable_ext.dart'; import 'package:PiliPlus/utils/storage_pref.dart'; -import 'package:collection/collection.dart'; -import 'package:flutter/material.dart'; +import 'package:flutter/rendering.dart' show Offset, Size; import 'package:screen_retriever/screen_retriever.dart'; Future calcWindowPosition(Size windowSize) async { diff --git a/lib/utils/color_utils.dart b/lib/utils/color_utils.dart new file mode 100644 index 000000000..58c85137f --- /dev/null +++ b/lib/utils/color_utils.dart @@ -0,0 +1,17 @@ +import 'package:flutter/rendering.dart' show Color; + +abstract final class ColourUtils { + static Color parseColor(String color) => + Color(int.parse('FF${color.substring(1)}', radix: 16)); + + static Color parseMedalColor(String color) => Color( + int.parse('${color.substring(7)}${color.substring(1, 7)}', radix: 16), + ); + + static Color index2Color(int index, Color color) => switch (index) { + 0 => const Color(0xFFfdad13), + 1 => const Color(0xFF8aace1), + 2 => const Color(0xFFdfa777), + _ => color, + }; +} diff --git a/lib/utils/connectivity_utils.dart b/lib/utils/connectivity_utils.dart new file mode 100644 index 000000000..ec571f9b8 --- /dev/null +++ b/lib/utils/connectivity_utils.dart @@ -0,0 +1,15 @@ +import 'package:PiliPlus/utils/platform_utils.dart'; +import 'package:connectivity_plus/connectivity_plus.dart'; + +abstract final class ConnectivityUtils { + static Future get isWiFi async { + try { + return PlatformUtils.isMobile && + (await Connectivity().checkConnectivity()).contains( + ConnectivityResult.wifi, + ); + } catch (_) { + return true; + } + } +} diff --git a/lib/utils/device_utils.dart b/lib/utils/device_utils.dart new file mode 100644 index 000000000..47cf7be69 --- /dev/null +++ b/lib/utils/device_utils.dart @@ -0,0 +1,21 @@ +import 'package:PiliPlus/utils/platform_utils.dart'; +import 'package:flutter/widgets.dart' show WidgetsBinding, Size; + +abstract final class DeviceUtils { + static late int sdkInt; + + static bool get isTablet { + return size.shortestSide >= 600; + } + + static Size get size { + final view = WidgetsBinding.instance.platformDispatcher.views.first; + return view.physicalSize / view.devicePixelRatio; + } + + static String get platformName => PlatformUtils.isDesktop + ? 'desktop' + : isTablet + ? 'pad' + : 'phone'; +} diff --git a/lib/utils/extension/context_ext.dart b/lib/utils/extension/context_ext.dart index dfdb01917..a566a3216 100644 --- a/lib/utils/extension/context_ext.dart +++ b/lib/utils/extension/context_ext.dart @@ -1,4 +1,3 @@ -import 'package:PiliPlus/utils/platform_utils.dart'; import 'package:flutter/material.dart'; /// from Getx @@ -72,10 +71,4 @@ extension ContextExtensions on BuildContext { /// True if the current device is Tablet bool get isTablet => isSmallTablet || isLargeTablet; - - String get platformName => PlatformUtils.isDesktop - ? 'desktop' - : isTablet - ? 'pad' - : 'phone'; } diff --git a/lib/utils/extension/dimension_ext.dart b/lib/utils/extension/dimension_ext.dart index 151d953b6..d52a551dd 100644 --- a/lib/utils/extension/dimension_ext.dart +++ b/lib/utils/extension/dimension_ext.dart @@ -3,3 +3,16 @@ import 'package:PiliPlus/grpc/bilibili/app/archive/v1.pb.dart' show Dimension; extension DimensionExt on Dimension { bool get isVertical => rotate == .ONE ? width > height : height > width; } + +extension StringExt on String { + bool get isVerticalFromUri { + try { + final params = Uri.parse(this).queryParameters; + final width = int.parse(params['player_width']!); + final height = int.parse(params['player_height']!); + return params['player_rotate'] == '1' ? width > height : height > width; + } catch (_) { + return false; + } + } +} diff --git a/lib/utils/extension/file_ext.dart b/lib/utils/extension/file_ext.dart index 974118185..2f593017b 100644 --- a/lib/utils/extension/file_ext.dart +++ b/lib/utils/extension/file_ext.dart @@ -1,4 +1,4 @@ -import 'dart:io'; +import 'dart:io' show FileSystemEntity, Directory; extension FileSystemEntityExt on FileSystemEntity { Future tryDel({bool recursive = false}) async { diff --git a/lib/utils/extension/get_ext.dart b/lib/utils/extension/get_ext.dart index 01639b3cb..1a532e88b 100644 --- a/lib/utils/extension/get_ext.dart +++ b/lib/utils/extension/get_ext.dart @@ -6,10 +6,10 @@ extension GetExt on GetInterface { GetInstance().putOrFind(dep, tag: tag); void updateMyAppTheme() { - final (l, d) = MyApp.getAllTheme(); + final (light, dark) = MyApp.getAllTheme(); rootController - ..theme = l - ..darkTheme = d + ..theme = light + ..darkTheme = dark ..update(); } } diff --git a/lib/utils/extension/num_ext.dart b/lib/utils/extension/num_ext.dart index 397eb12f7..5e46e6b2f 100644 --- a/lib/utils/extension/num_ext.dart +++ b/lib/utils/extension/num_ext.dart @@ -1,6 +1,6 @@ import 'dart:math' show pow; -import 'package:flutter/widgets.dart'; +import 'package:flutter/widgets.dart' show BuildContext, MediaQuery; extension ImageExtension on num { int? cacheSize(BuildContext context) { diff --git a/lib/utils/extension/scroll_controller_ext.dart b/lib/utils/extension/scroll_controller_ext.dart index 5e2a7d2ac..7e53ec37f 100644 --- a/lib/utils/extension/scroll_controller_ext.dart +++ b/lib/utils/extension/scroll_controller_ext.dart @@ -1,4 +1,4 @@ -import 'package:flutter/widgets.dart'; +import 'package:flutter/widgets.dart' show ScrollController, Curves; extension ScrollControllerExt on ScrollController { void animToTop() => animTo(0); diff --git a/lib/utils/extension/theme_ext.dart b/lib/utils/extension/theme_ext.dart index 3f3151a78..b47191990 100644 --- a/lib/utils/extension/theme_ext.dart +++ b/lib/utils/extension/theme_ext.dart @@ -1,9 +1,16 @@ import 'package:flex_seed_scheme/flex_seed_scheme.dart'; -import 'package:flutter/material.dart'; +import 'package:flutter/material.dart' + show ThemeData, Color, ColorScheme, Brightness, Colors; const _pinkLight = Color(0xFFFF6699); const _pinkDark = Color(0xFFD44E7D); +extension ThemeDataExt on ThemeData { + bool get isLight => brightness.isLight; + + bool get isDark => brightness.isDark; +} + extension ColorSchemeExt on ColorScheme { Color get vipColor => brightness.isLight ? _pinkLight : _pinkDark; diff --git a/lib/utils/id_utils.dart b/lib/utils/id_utils.dart index 20321f3e3..0ffa177f6 100644 --- a/lib/utils/id_utils.dart +++ b/lib/utils/id_utils.dart @@ -1,6 +1,6 @@ // ignore_for_file: constant_identifier_names, non_constant_identifier_names -import 'dart:convert'; +import 'dart:convert' show ascii, base64; import 'package:PiliPlus/utils/utils.dart'; import 'package:uuid/v4.dart'; diff --git a/lib/utils/image_utils.dart b/lib/utils/image_utils.dart index 68641dc0c..eced23ded 100644 --- a/lib/utils/image_utils.dart +++ b/lib/utils/image_utils.dart @@ -1,15 +1,17 @@ -import 'dart:io'; +import 'dart:io' show File, Platform; import 'dart:math' as math; -import 'dart:typed_data'; +import 'dart:typed_data' show Uint8List; import 'package:PiliPlus/common/constants.dart'; import 'package:PiliPlus/http/init.dart'; +import 'package:PiliPlus/utils/device_utils.dart'; import 'package:PiliPlus/utils/extension/file_ext.dart'; import 'package:PiliPlus/utils/extension/string_ext.dart'; import 'package:PiliPlus/utils/global_data.dart'; import 'package:PiliPlus/utils/path_utils.dart'; import 'package:PiliPlus/utils/permission_handler.dart'; import 'package:PiliPlus/utils/platform_utils.dart'; +import 'package:PiliPlus/utils/share_utils.dart'; import 'package:PiliPlus/utils/storage_pref.dart'; import 'package:PiliPlus/utils/utils.dart'; import 'package:dio/dio.dart'; @@ -40,7 +42,7 @@ abstract final class ImageUtils { .share( ShareParams( files: [XFile(path)], - sharePositionOrigin: await Utils.sharePositionOrigin, + sharePositionOrigin: await ShareUtils.sharePositionOrigin, ), ) .whenComplete(File(path).tryDel); @@ -80,7 +82,7 @@ abstract final class ImageUtils { static Future checkPermissionDependOnSdkInt() { if (Platform.isAndroid) { - if (Utils.sdkInt < 29) { + if (DeviceUtils.sdkInt < 29) { return requestPer(); } else { return Future.syncValue(true); diff --git a/lib/utils/parse_int.dart b/lib/utils/parse_int.dart new file mode 100644 index 000000000..95c163063 --- /dev/null +++ b/lib/utils/parse_int.dart @@ -0,0 +1,6 @@ +int? safeToInt(dynamic value) => switch (value) { + int() => value, + String() => int.tryParse(value), + num() => value.toInt(), + _ => null, +}; diff --git a/lib/utils/parse_string.dart b/lib/utils/parse_string.dart index 17da1d070..bc2684fbd 100644 --- a/lib/utils/parse_string.dart +++ b/lib/utils/parse_string.dart @@ -1,4 +1,4 @@ -String? noneNullOrEmptyString(String? value) { +String? nonNullOrEmptyString(String? value) { if (value == null || value.isEmpty) return null; return value; } diff --git a/lib/utils/reply_utils.dart b/lib/utils/reply_utils.dart index c1cf9702a..18772a205 100644 --- a/lib/utils/reply_utils.dart +++ b/lib/utils/reply_utils.dart @@ -9,7 +9,9 @@ import 'package:PiliPlus/models/common/reply/reply_sort_type.dart'; import 'package:PiliPlus/utils/accounts.dart'; import 'package:PiliPlus/utils/accounts/account.dart'; import 'package:PiliPlus/utils/extension/iterable_ext.dart'; +import 'package:PiliPlus/utils/extension/theme_ext.dart'; import 'package:PiliPlus/utils/id_utils.dart'; +import 'package:PiliPlus/utils/theme_utils.dart'; import 'package:PiliPlus/utils/utils.dart'; import 'package:flutter/foundation.dart' show kDebugMode; import 'package:flutter/material.dart'; @@ -98,6 +100,7 @@ abstract final class ReplyUtils { await Future.delayed(const Duration(seconds: 8)); } void showReplyCheckResult(String message, {bool isBan = false}) { + final theme = ThemeUtils.theme; final actions = [ if (isBan) TextButton( @@ -117,7 +120,7 @@ abstract final class ReplyUtils { '/webview', parameters: { 'url': - 'https://www.bilibili.com/h5/comment/appeal?${Utils.themeUrl(Get.isDarkMode)}', + 'https://www.bilibili.com/h5/comment/appeal?${ThemeUtils.themeUrl(theme.isDark)}', }, ); }, @@ -128,7 +131,7 @@ abstract final class ReplyUtils { onPressed: Get.back, child: Text( '关闭', - style: TextStyle(color: Get.theme.colorScheme.outline), + style: TextStyle(color: theme.colorScheme.outline), ), ), ]; diff --git a/lib/utils/request_utils.dart b/lib/utils/request_utils.dart index ad763ea2f..a8b623ad3 100644 --- a/lib/utils/request_utils.dart +++ b/lib/utils/request_utils.dart @@ -30,11 +30,13 @@ import 'package:PiliPlus/utils/accounts.dart'; import 'package:PiliPlus/utils/extension/context_ext.dart'; import 'package:PiliPlus/utils/extension/size_ext.dart'; import 'package:PiliPlus/utils/extension/string_ext.dart'; +import 'package:PiliPlus/utils/extension/theme_ext.dart'; import 'package:PiliPlus/utils/feed_back.dart'; import 'package:PiliPlus/utils/platform_utils.dart'; import 'package:PiliPlus/utils/storage.dart'; import 'package:PiliPlus/utils/storage_key.dart'; import 'package:PiliPlus/utils/storage_pref.dart'; +import 'package:PiliPlus/utils/theme_utils.dart'; import 'package:PiliPlus/utils/utils.dart'; import 'package:flutter/foundation.dart' show kDebugMode; import 'package:flutter/material.dart'; @@ -344,6 +346,7 @@ abstract final class RequestUtils { clearCookie: true, ); final isSuccess = res.isSuccess; + final theme = ThemeUtils.theme; final actions = [ if (!isSuccess) TextButton( @@ -354,7 +357,7 @@ abstract final class RequestUtils { '/webview', parameters: { 'url': - 'https://www.bilibili.com/h5/comment/appeal?${Utils.themeUrl(Get.isDarkMode)}', + 'https://www.bilibili.com/h5/comment/appeal?${ThemeUtils.themeUrl(theme.isDark)}', }, ); }, @@ -365,7 +368,7 @@ abstract final class RequestUtils { onPressed: Get.back, child: Text( '关闭', - style: TextStyle(color: Get.theme.colorScheme.outline), + style: TextStyle(color: theme.colorScheme.outline), ), ), ]; diff --git a/lib/utils/share_utils.dart b/lib/utils/share_utils.dart new file mode 100644 index 000000000..c6884eb7e --- /dev/null +++ b/lib/utils/share_utils.dart @@ -0,0 +1,41 @@ +import 'dart:io' show Platform; + +import 'package:PiliPlus/utils/device_utils.dart'; +import 'package:PiliPlus/utils/platform_utils.dart'; +import 'package:PiliPlus/utils/utils.dart'; +import 'package:device_info_plus/device_info_plus.dart'; +import 'package:flutter/rendering.dart' show Rect; +import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; +import 'package:share_plus/share_plus.dart'; + +abstract final class ShareUtils { + static bool? _isIpad; + static Future get isIpad async { + if (!Platform.isIOS) return false; + return _isIpad ??= (await DeviceInfoPlugin().iosInfo).model + .toLowerCase() + .contains('ipad'); + } + + static Future get sharePositionOrigin async { + if (await isIpad) { + final screenSize = DeviceUtils.size; + return Rect.fromLTRB(0, 0, screenSize.width, screenSize.height / 2); + } + return null; + } + + static Future shareText(String text) async { + if (PlatformUtils.isDesktop) { + Utils.copyText(text); + return; + } + try { + await SharePlus.instance.share( + ShareParams(text: text, sharePositionOrigin: await sharePositionOrigin), + ); + } catch (e) { + SmartDialog.showToast(e.toString()); + } + } +} diff --git a/lib/utils/storage_pref.dart b/lib/utils/storage_pref.dart index b7c443afd..b7337cefe 100644 --- a/lib/utils/storage_pref.dart +++ b/lib/utils/storage_pref.dart @@ -30,6 +30,7 @@ import 'package:PiliPlus/plugin/pl_player/models/bottom_progress_behavior.dart'; import 'package:PiliPlus/plugin/pl_player/models/fullscreen_mode.dart'; import 'package:PiliPlus/plugin/pl_player/models/hwdec_type.dart'; import 'package:PiliPlus/plugin/pl_player/models/play_repeat.dart'; +import 'package:PiliPlus/utils/device_utils.dart'; import 'package:PiliPlus/utils/extension/iterable_ext.dart'; import 'package:PiliPlus/utils/global_data.dart'; import 'package:PiliPlus/utils/login_utils.dart'; @@ -192,7 +193,9 @@ abstract final class Pref { static FullScreenMode get fullScreenMode { int? index = _setting.get(SettingBoxKey.fullScreenMode); if (index == null) { - final FullScreenMode mode = horizontalScreen && isTablet ? .none : .auto; + final FullScreenMode mode = horizontalScreen && DeviceUtils.isTablet + ? .none + : .auto; _setting.put(SettingBoxKey.fullScreenMode, mode.index); return mode; } @@ -594,15 +597,14 @@ abstract final class Pref { static bool get optTabletNav => _setting.get(SettingBoxKey.optTabletNav, defaultValue: true); - static bool get horizontalScreen => - _setting.get(SettingBoxKey.horizontalScreen) ?? isTablet; - - static bool get isTablet { - final view = WidgetsBinding.instance.platformDispatcher.views.first; - final size = view.physicalSize / view.devicePixelRatio; - final isTablet = size.shortestSide >= 600; - _setting.put(SettingBoxKey.horizontalScreen, isTablet); - return isTablet; + static bool get horizontalScreen { + bool? horizontalScreen = _setting.get(SettingBoxKey.horizontalScreen); + if (horizontalScreen == null) { + final isTablet = DeviceUtils.isTablet; + _setting.put(SettingBoxKey.horizontalScreen, isTablet); + return isTablet; + } + return horizontalScreen; } static String get banWordForDyn => diff --git a/lib/utils/storage_utils.dart b/lib/utils/storage_utils.dart new file mode 100644 index 000000000..f65d1eff2 --- /dev/null +++ b/lib/utils/storage_utils.dart @@ -0,0 +1,34 @@ +import 'dart:io' show File; +import 'dart:typed_data' show Uint8List; + +import 'package:PiliPlus/utils/platform_utils.dart'; +import 'package:file_picker/file_picker.dart'; +import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; + +abstract final class StorageUtils { + static Future saveBytes2File({ + required String name, + required Uint8List bytes, + required List allowedExtensions, + FileType type = FileType.custom, + }) async { + try { + final path = await FilePicker.saveFile( + allowedExtensions: allowedExtensions, + type: type, + fileName: name, + bytes: PlatformUtils.isDesktop ? null : bytes, + ); + if (path == null) { + SmartDialog.showToast("取消保存"); + return; + } + if (PlatformUtils.isDesktop) { + await File(path).writeAsBytes(bytes); + } + SmartDialog.showToast("已保存"); + } catch (e) { + SmartDialog.showToast("保存失败: $e"); + } + } +} diff --git a/lib/utils/theme_utils.dart b/lib/utils/theme_utils.dart index f1c76b1be..d37f75c35 100644 --- a/lib/utils/theme_utils.dart +++ b/lib/utils/theme_utils.dart @@ -1,11 +1,31 @@ import 'package:PiliPlus/common/style.dart'; -import 'package:PiliPlus/main.dart'; import 'package:PiliPlus/utils/extension/theme_ext.dart'; import 'package:PiliPlus/utils/storage_pref.dart'; -import 'package:flutter/cupertino.dart'; +import 'package:flutter/cupertino.dart' show CupertinoThemeData; +import 'package:flutter/foundation.dart' show PlatformDispatcher; import 'package:flutter/material.dart'; abstract final class ThemeUtils { + static late ThemeData lightTheme; + + static late ThemeData darkTheme; + + static late ThemeMode themeMode; + + static ThemeData get theme { + if (themeMode == .dark || + (themeMode == .system && + PlatformDispatcher.instance.platformBrightness == .dark)) { + return darkTheme; + } + return lightTheme; + } + + static bool get isDarkMode => theme.isDark; + + static String themeUrl(bool isDark) => + 'native.theme=${isDark ? 2 : 1}&night=${isDark ? 1 : 0}'; + static ThemeData getThemeData({ required ColorScheme colorScheme, required bool isDynamic, @@ -134,9 +154,6 @@ abstract final class ThemeUtils { if (Pref.isPureBlackTheme) { themeData = darkenTheme(themeData); } - if (Pref.darkVideoPage) { - MyApp.darkThemeData = themeData; - } } return themeData; } diff --git a/lib/utils/url_utils.dart b/lib/utils/url_utils.dart index a6f50d42d..0ab631c66 100644 --- a/lib/utils/url_utils.dart +++ b/lib/utils/url_utils.dart @@ -4,8 +4,7 @@ import 'package:PiliPlus/utils/accounts/account.dart'; import 'package:PiliPlus/utils/id_utils.dart'; import 'package:PiliPlus/utils/page_utils.dart'; import 'package:dio/dio.dart'; -import 'package:flutter/foundation.dart' show kDebugMode; -import 'package:flutter/material.dart'; +import 'package:flutter/foundation.dart' show kDebugMode, debugPrint; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; abstract final class UrlUtils { diff --git a/lib/utils/utils.dart b/lib/utils/utils.dart index 496882762..1b7258109 100644 --- a/lib/utils/utils.dart +++ b/lib/utils/utils.dart @@ -1,18 +1,11 @@ -import 'dart:async'; -import 'dart:convert'; -import 'dart:io'; +import 'dart:convert' show JsonEncoder, base64; import 'dart:math' show Random; import 'package:PiliPlus/common/constants.dart'; -import 'package:PiliPlus/utils/platform_utils.dart'; import 'package:catcher_2/catcher_2.dart'; -import 'package:connectivity_plus/connectivity_plus.dart'; -import 'package:device_info_plus/device_info_plus.dart'; -import 'package:file_picker/file_picker.dart'; -import 'package:flutter/services.dart'; +import 'package:flutter/services.dart' + show Clipboard, ClipboardData, MethodChannel; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; -import 'package:get/get.dart'; -import 'package:share_plus/share_plus.dart'; abstract final class Utils { static final random = Random(); @@ -21,119 +14,6 @@ abstract final class Utils { static const jsonEncoder = JsonEncoder.withIndent(' '); - static bool isCustomFollowTag(int? tagid) { - return tagid != null && tagid != 0 && tagid != -10 && tagid != -2; - } - - static String levelName( - Object level, { - bool isSeniorMember = false, - }) => 'assets/images/lv/lv${isSeniorMember ? '6_s' : level}.png'; - - static Color index2Color(int index, Color color) => switch (index) { - 0 => const Color(0xFFfdad13), - 1 => const Color(0xFF8aace1), - 2 => const Color(0xFFdfa777), - _ => color, - }; - - static bool getDimensionFromUri(String uri) { - try { - final params = Uri.parse(uri).queryParameters; - final width = int.parse(params['player_width']!); - final height = int.parse(params['player_height']!); - return params['player_rotate'] == '1' ? width > height : height > width; - } catch (_) { - return false; - } - } - - static String themeUrl(bool isDark) => - 'native.theme=${isDark ? 2 : 1}&night=${isDark ? 1 : 0}'; - - static Future saveBytes2File({ - required String name, - required Uint8List bytes, - required List allowedExtensions, - FileType type = FileType.custom, - }) async { - try { - final path = await FilePicker.saveFile( - allowedExtensions: allowedExtensions, - type: type, - fileName: name, - bytes: PlatformUtils.isDesktop ? null : bytes, - ); - if (path == null) { - SmartDialog.showToast("取消保存"); - return; - } - if (PlatformUtils.isDesktop) { - await File(path).writeAsBytes(bytes); - } - SmartDialog.showToast("已保存"); - } catch (e) { - SmartDialog.showToast("保存失败: $e"); - } - } - - static int? safeToInt(dynamic value) => switch (value) { - int e => e, - String e => int.tryParse(e), - num e => e.toInt(), - _ => null, - }; - - static Future get isWiFi async { - try { - return PlatformUtils.isMobile && - (await Connectivity().checkConnectivity()).contains( - ConnectivityResult.wifi, - ); - } catch (_) { - return true; - } - } - - static Color parseColor(String color) => - Color(int.parse('FF${color.substring(1)}', radix: 16)); - - static Color parseMedalColor(String color) => Color( - int.parse('${color.substring(7)}${color.substring(1, 7)}', radix: 16), - ); - - static late int sdkInt; - - static bool? _isIpad; - static Future get isIpad async { - if (!Platform.isIOS) return false; - return _isIpad ??= (await DeviceInfoPlugin().iosInfo).model - .toLowerCase() - .contains('ipad'); - } - - static Future get sharePositionOrigin async { - if (await isIpad) { - final size = Get.size; - return Rect.fromLTRB(0, 0, size.width, size.height / 2); - } - return null; - } - - static Future shareText(String text) async { - if (PlatformUtils.isDesktop) { - copyText(text); - return; - } - try { - await SharePlus.instance.share( - ShareParams(text: text, sharePositionOrigin: await sharePositionOrigin), - ); - } catch (e) { - SmartDialog.showToast(e.toString()); - } - } - static final numericRegex = RegExp(r'^[\d\.]+$'); static bool isStringNumeric(String str) { return numericRegex.hasMatch(str); diff --git a/lib/utils/video_utils.dart b/lib/utils/video_utils.dart index 08d000a80..c82b7b710 100644 --- a/lib/utils/video_utils.dart +++ b/lib/utils/video_utils.dart @@ -1,7 +1,7 @@ import 'package:PiliPlus/models/common/video/cdn_type.dart'; import 'package:PiliPlus/models_new/live/live_room_play_info/codec.dart'; import 'package:PiliPlus/utils/storage_pref.dart'; -import 'package:flutter/foundation.dart'; +import 'package:flutter/foundation.dart' show kDebugMode, debugPrint; abstract final class VideoUtils { static CDNService cdnService = Pref.defaultCDNService; diff --git a/pubspec.lock b/pubspec.lock index cd427db4c..e8072fc34 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -794,7 +794,7 @@ packages: description: path: "." ref: "version_4.7.2" - resolved-ref: "81b8a71982f89b46fa868b315cd71ff6a6ddf895" + resolved-ref: "388fcb22ef24ac0a693949148d29fa6b4922159f" url: "https://github.com/bggRGjQaUbCoE/getx.git" source: git version: "4.7.2" diff --git a/pubspec.yaml b/pubspec.yaml index f766e072d..1acb92388 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -350,9 +350,9 @@ flutter: - path: assets/images/lv/ - path: assets/images/logo/ - path: assets/images/logo/ico/ - platforms: [windows] + platforms: [ windows ] - path: assets/images/logo/desktop/ - platforms: [linux, macos] + platforms: [ linux, macos ] - path: assets/images/live/ - path: assets/images/video/ - path: assets/images/paycoins/