diff --git a/assets/translations/en-US.json b/assets/translations/en-US.json index fbc5835..d8c1f02 100644 --- a/assets/translations/en-US.json +++ b/assets/translations/en-US.json @@ -125,5 +125,9 @@ "settingsNetworkServerResetDescription": "Reset to the official server address of Solar Network.", "settingsNetworkServerPreset": "Present HyperNet Server", "settingsNetworkServerPresetDescription": "You can choose one of our preset HyperNet server addresses from the list on the right.", - "settingsNetworkServerSaved": "Server address saved." + "settingsNetworkServerSaved": "Server address saved.", + "sensitiveContent": "Sensitive Content", + "sensitiveContentCollapsed": "Sensitive content has been collapsed.", + "sensitiveContentDescription": "This content has been marked as sensitive, and may not be suitable for all viewers.", + "sensitiveContentReveal": "Reveal" } diff --git a/assets/translations/zh-CN.json b/assets/translations/zh-CN.json index 7e00e53..8fe5d09 100644 --- a/assets/translations/zh-CN.json +++ b/assets/translations/zh-CN.json @@ -125,5 +125,9 @@ "settingsNetworkServerResetDescription": "重设为 Solar Network 的服务器地址。", "settingsNetworkServerPreset": "预设的 HyperNet 服务器", "settingsNetworkServerPresetDescription": "你可以在旁边的列表中选择我们提供的预设 HyperNet 服务器地址。", - "settingsNetworkServerSaved": "服务器地址已保存。" + "settingsNetworkServerSaved": "服务器地址已保存。", + "sensitiveContent": "敏感内容", + "sensitiveContentCollapsed": "敏感内容已折叠。", + "sensitiveContentDescription": "此内容已被标记,可能不适合所有人查看。", + "sensitiveContentReveal": "显示内容" } diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index c10b985..703d3a0 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -161,7 +161,6 @@ 64FBE78F9C282712818D6D95 /* Pods-RunnerTests.release.xcconfig */, 96081771773FA019A97CCC3F /* Pods-RunnerTests.profile.xcconfig */, ); - name = Pods; path = Pods; sourceTree = ""; }; @@ -474,6 +473,7 @@ DEVELOPMENT_TEAM = W7HPZ53V6B; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = Solian; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -657,6 +657,7 @@ DEVELOPMENT_TEAM = W7HPZ53V6B; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = Solian; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -680,6 +681,7 @@ DEVELOPMENT_TEAM = W7HPZ53V6B; ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = Solian; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist index 2e1f684..f4f1653 100644 --- a/ios/Runner/Info.plist +++ b/ios/Runner/Info.plist @@ -5,7 +5,7 @@ CFBundleDevelopmentRegion $(DEVELOPMENT_LANGUAGE) CFBundleDisplayName - Surface + Solian CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier @@ -13,7 +13,7 @@ CFBundleInfoDictionaryVersion 6.0 CFBundleName - surface + Solian CFBundlePackageType APPL CFBundleShortVersionString diff --git a/lib/widgets/attachment/attachment_detail.dart b/lib/widgets/attachment/attachment_detail.dart index d483fda..24bf2d5 100644 --- a/lib/widgets/attachment/attachment_detail.dart +++ b/lib/widgets/attachment/attachment_detail.dart @@ -28,6 +28,9 @@ class AttachmentDetailPopup extends StatelessWidget { tag: 'attachment-${data.rid}-${heroTag ?? uuid.v4()}', child: PhotoView( key: Key('attachment-detail-${data.rid}-$heroTag'), + backgroundDecoration: BoxDecoration( + color: Colors.black.withOpacity(0.7), + ), imageProvider: UniversalImage.provider( sn.getAttachmentUrl(data.rid), ), diff --git a/lib/widgets/attachment/attachment_item.dart b/lib/widgets/attachment/attachment_item.dart index e73df98..04a7dd6 100644 --- a/lib/widgets/attachment/attachment_item.dart +++ b/lib/widgets/attachment/attachment_item.dart @@ -1,6 +1,12 @@ +import 'dart:ui'; + import 'package:dismissible_page/dismissible_page.dart'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; +import 'package:gap/gap.dart'; +import 'package:material_symbols_icons/symbols.dart'; import 'package:provider/provider.dart'; +import 'package:styled_widget/styled_widget.dart'; import 'package:surface/providers/sn_network.dart'; import 'package:surface/types/attachment.dart'; import 'package:surface/widgets/attachment/attachment_detail.dart'; @@ -23,15 +29,11 @@ class AttachmentItem extends StatelessWidget { case 'image': return Hero( tag: 'attachment-${data.rid}-$heroTag', - child: LayoutBuilder(builder: (context, constraints) { - return UniversalImage( - sn.getAttachmentUrl(data.rid), - key: Key('attachment-${data.rid}-$heroTag'), - fit: BoxFit.cover, - cacheHeight: constraints.maxHeight, - cacheWidth: constraints.maxWidth, - ); - }), + child: AutoResizeUniversalImage( + sn.getAttachmentUrl(data.rid), + key: Key('attachment-${data.rid}-$heroTag'), + fit: BoxFit.cover, + ), ); default: return const Placeholder(); @@ -43,6 +45,12 @@ class AttachmentItem extends StatelessWidget { final uuid = Uuid(); final heroTag = uuid.v4(); + if (data.isMature) { + return _AttachmentItemSensitiveBlur( + child: _buildContent(context, heroTag), + ); + } + if (isExpandable) { return GestureDetector( child: _buildContent(context, heroTag), @@ -58,3 +66,87 @@ class AttachmentItem extends StatelessWidget { return _buildContent(context, heroTag); } } + +class _AttachmentItemSensitiveBlur extends StatefulWidget { + final Widget child; + const _AttachmentItemSensitiveBlur({super.key, required this.child}); + + @override + State<_AttachmentItemSensitiveBlur> createState() => + _AttachmentItemSensitiveBlurState(); +} + +class _AttachmentItemSensitiveBlurState + extends State<_AttachmentItemSensitiveBlur> { + bool _doesShow = false; + + @override + Widget build(BuildContext context) { + return Stack( + children: [ + widget.child, + ClipRect( + child: BackdropFilter( + filter: ImageFilter.blur(sigmaX: 40, sigmaY: 40), + child: Container( + color: Colors.black.withOpacity(0.5), + alignment: Alignment.center, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Icon( + Symbols.visibility_off, + color: Colors.white, + size: 32, + ), + const Gap(8), + Text('sensitiveContent') + .tr() + .fontSize(20) + .textColor(Colors.white) + .bold(), + Text('sensitiveContentDescription') + .tr() + .fontSize(14) + .textColor(Colors.white.withOpacity(0.8)), + const Gap(16), + InkWell( + child: Text('sensitiveContentReveal') + .tr() + .textColor(Colors.white), + onTap: () { + setState(() => _doesShow = !_doesShow); + }, + ), + ], + ), + ), + ), + ) + .opacity(_doesShow ? 0 : 1, animate: true) + .animate(const Duration(milliseconds: 300), Curves.easeInOut), + if (_doesShow) + Positioned( + top: 0, + left: 0, + child: InkWell( + child: Icon( + Symbols.visibility_off, + color: Colors.white, + shadows: [ + BoxShadow( + color: Colors.black.withOpacity(0.5), + blurRadius: 3, + offset: Offset(0, 1.5), + ), + ], + ).padding(all: 12), + onTap: () { + setState(() => _doesShow = !_doesShow); + }, + ), + ), + ], + ); + } +} diff --git a/pubspec.lock b/pubspec.lock index ff87c1b..73d330c 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,23 +5,23 @@ packages: dependency: transitive description: name: _fe_analyzer_shared - sha256: "16e298750b6d0af7ce8a3ba7c18c69c3785d11b15ec83f6dcd0ad2a0009b3cab" + sha256: f256b0c0ba6c7577c15e2e4e114755640a875e885099367bf6e012b19314c834 url: "https://pub.dev" source: hosted - version: "76.0.0" + version: "72.0.0" _macros: dependency: transitive description: dart source: sdk - version: "0.3.3" + version: "0.3.2" analyzer: dependency: transitive description: name: analyzer - sha256: "1f14db053a8c23e260789e9b0980fa27f2680dd640932cae5e1137cce0e46e1e" + sha256: b652861553cd3990d8ed361f7979dc6d7053a9ac8843fa73820ab68ce5410139 url: "https://pub.dev" source: hosted - version: "6.11.0" + version: "6.7.0" animations: dependency: "direct main" description: @@ -202,10 +202,10 @@ packages: dependency: "direct main" description: name: collection - sha256: a1ace0a119f20aabc852d165077c036cd864315bd99b7eaa10a60100341941bf + sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a url: "https://pub.dev" source: hosted - version: "1.19.0" + version: "1.18.0" connectivity_plus: dependency: transitive description: @@ -790,18 +790,18 @@ packages: dependency: transitive description: name: leak_tracker - sha256: c35baad643ba394b40aac41080300150a4f08fd0fd6a10378f8f7c6bc161acec + sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05" url: "https://pub.dev" source: hosted - version: "10.0.8" + version: "10.0.5" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573 + sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806" url: "https://pub.dev" source: hosted - version: "3.0.9" + version: "3.0.5" leak_tracker_testing: dependency: transitive description: @@ -838,10 +838,10 @@ packages: dependency: transitive description: name: macros - sha256: "1d9e801cd66f7ea3663c45fc708450db1fa57f988142c64289142c9b7ee80656" + sha256: "0acaed5d6b7eab89f63350bccd82119e6c602df0f391260d0e32b5e23db79536" url: "https://pub.dev" source: hosted - version: "0.1.3-main.0" + version: "0.1.2-main.4" markdown: dependency: "direct main" description: @@ -1150,7 +1150,7 @@ packages: dependency: transitive description: flutter source: sdk - version: "0.0.0" + version: "0.0.99" source_gen: dependency: transitive description: @@ -1227,10 +1227,10 @@ packages: dependency: transitive description: name: stack_trace - sha256: "9f47fd3630d76be3ab26f0ee06d213679aa425996925ff3feffdec504931c377" + sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" url: "https://pub.dev" source: hosted - version: "1.12.0" + version: "1.11.1" stream_channel: dependency: transitive description: @@ -1251,10 +1251,10 @@ packages: dependency: transitive description: name: string_scanner - sha256: "688af5ed3402a4bde5b3a6c15fd768dbf2621a614950b17f04626c431ab3c4c3" + sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" url: "https://pub.dev" source: hosted - version: "1.3.0" + version: "1.2.0" styled_widget: dependency: "direct main" description: @@ -1291,10 +1291,10 @@ packages: dependency: transitive description: name: test_api - sha256: "664d3a9a64782fcdeb83ce9c6b39e78fd2971d4e37827b9b06c3aa1edc5e760c" + sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb" url: "https://pub.dev" source: hosted - version: "0.7.3" + version: "0.7.2" timing: dependency: transitive description: @@ -1411,10 +1411,10 @@ packages: dependency: transitive description: name: vm_service - sha256: f6be3ed8bd01289b34d679c2b62226f63c0e69f9fd2e50a6b3c1c729a961041b + sha256: "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d" url: "https://pub.dev" source: hosted - version: "14.3.0" + version: "14.2.5" watcher: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index e296054..4e27b72 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -16,7 +16,7 @@ publish_to: "none" # Remove this line if you wish to publish to pub.dev # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html # In Windows, build-name is used as the major, minor, and patch parts # of the product and file versions while build-number is used as the build suffix. -version: 1.0.0+1 +version: 2.0.0+1 environment: sdk: ^3.5.4 @@ -166,4 +166,5 @@ flutter_native_splash: color_dark: "#000000" branding: "assets/icon/branding-light.png" branding_dark: "assets/icon/branding-dark.png" - branding_bottom_padding: 24 \ No newline at end of file + branding_bottom_padding: 24 +