* opt: proxy

* opt: calcWindowPosition

* fix: height depend on svg

* bump

* fix

* ci: cache linux

* string systemProxyPort

---------

Co-authored-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
My-Responsitories
2025-10-04 09:44:41 +08:00
committed by GitHub
parent a928e48159
commit a5715868b3
9 changed files with 315 additions and 173 deletions

View File

@@ -17,41 +17,35 @@ jobs:
steps:
- name: 代码迁出
uses: actions/checkout@v4
uses: actions/checkout@v5
with:
fetch-depth: 0
- name: 构建Java环境
uses: actions/setup-java@v4
uses: actions/setup-java@v5
with:
distribution: "zulu"
java-version: "17"
- name: 检查缓存
uses: actions/cache@v4
id: cache-flutter
with:
path: /root/flutter-sdk # Flutter SDK 的路径
key: ${{ runner.os }}-flutter-${{ hashFiles('**/pubspec.lock') }}
cache: 'gradle'
cache-dependency-path: |
android/*.gradle*
android/**/gradle-wrapper.properties
- name: 安装Flutter
if: steps.cache-flutter.outputs.cache-hit != 'true'
uses: subosito/flutter-action@v2
id: flutter-action
with:
channel: stable
flutter-version-file: pubspec.yaml
cache: true
- name: apply bottom sheet patch
if: steps.flutter-action.outputs.CACHE-HIT != 'true'
working-directory: ${{ env.FLUTTER_ROOT }}
run: |
git apply $GITHUB_WORKSPACE/lib/scripts/bottom_sheet_patch.diff
git config --global user.name "github-actions[bot]"
git config --global user.email "github-actions[bot]@users.noreply.github.com"
git add .
git commit -m "bottom sheet patch"
run: git apply $GITHUB_WORKSPACE/lib/scripts/bottom_sheet_patch.diff
- name: 下载项目依赖
run: flutter pub get
# - name: 下载项目依赖
# run: flutter pub get
- name: Write key
if: github.event_name != 'pull_request'
@@ -66,9 +60,8 @@ jobs:
- name: flutter build apk
run: |
chmod +x lib/scripts/build.dart
dart lib/scripts/build.dart "android"
flutter build apk --release --split-per-abi
flutter build apk --release --split-per-abi --pub
- name: 上传
uses: actions/upload-artifact@v4

View File

@@ -21,7 +21,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
uses: actions/checkout@v5
with:
ref: ${{ github.event.inputs.branch }}
fetch-depth: 0
@@ -51,10 +51,7 @@ jobs:
with:
channel: stable
flutter-version-file: pubspec.yaml
- name: Get Flutter dependencies
run: flutter pub get
shell: bash
cache: true
- name: Set and Extract version
run: |
@@ -65,7 +62,7 @@ jobs:
#TODO: deb and rpm packages need to be build
- name: Build Linux
run: flutter build linux --release -v
run: flutter build linux --release -v --pub
- name: Package .tar.gz
run: tar -zcvf PiliPlus_linux_${{ env.version }}_amd64.tar.gz -C build/linux/x64/release/bundle .
@@ -124,4 +121,4 @@ jobs:
with:
name: Linux_deb_package
path: PiliPlus_linux_*.deb

View File

@@ -0,0 +1,226 @@
// code from cached_network_svg_image;
import 'dart:developer';
import 'package:flutter/material.dart';
import 'package:flutter/scheduler.dart';
import 'package:flutter_cache_manager/flutter_cache_manager.dart';
import 'package:flutter_svg/flutter_svg.dart';
class CachedNetworkSVGImage extends StatefulWidget {
CachedNetworkSVGImage(
String url, {
Key? key,
String? cacheKey,
Widget? placeholder,
Widget? errorWidget,
double? width,
double? height,
Map<String, String>? headers,
BoxFit fit = BoxFit.contain,
AlignmentGeometry alignment = Alignment.center,
bool matchTextDirection = false,
bool allowDrawingOutsideViewBox = false,
String? semanticsLabel,
bool excludeFromSemantics = false,
SvgTheme theme = const SvgTheme(),
ColorFilter? colorFilter,
WidgetBuilder? placeholderBuilder,
BaseCacheManager? cacheManager,
}) : _url = url,
_cacheKey = cacheKey,
_placeholder = placeholder,
_errorWidget = errorWidget,
_width = width,
_height = height,
_headers = headers,
_fit = fit,
_alignment = alignment,
_matchTextDirection = matchTextDirection,
_allowDrawingOutsideViewBox = allowDrawingOutsideViewBox,
_semanticsLabel = semanticsLabel,
_excludeFromSemantics = excludeFromSemantics,
_theme = theme,
_colorFilter = colorFilter,
_placeholderBuilder = placeholderBuilder,
_cacheManager = cacheManager ?? DefaultCacheManager(),
super(key: key ?? ValueKey(cacheKey ?? url));
final String _url;
final String? _cacheKey;
final Widget? _placeholder;
final Widget? _errorWidget;
final double? _width;
final double? _height;
final Map<String, String>? _headers;
final BoxFit _fit;
final AlignmentGeometry _alignment;
final bool _matchTextDirection;
final bool _allowDrawingOutsideViewBox;
final String? _semanticsLabel;
final bool _excludeFromSemantics;
final SvgTheme _theme;
final ColorFilter? _colorFilter;
final WidgetBuilder? _placeholderBuilder;
final BaseCacheManager _cacheManager;
@override
State<CachedNetworkSVGImage> createState() => _CachedNetworkSVGImageState();
static Future<void> preCache(
String imageUrl, {
String? cacheKey,
BaseCacheManager? cacheManager,
}) {
final key = cacheKey ?? _generateKeyFromUrl(imageUrl);
cacheManager ??= DefaultCacheManager();
return cacheManager.downloadFile(key);
}
static Future<void> clearCacheForUrl(
String imageUrl, {
String? cacheKey,
BaseCacheManager? cacheManager,
}) {
final key = cacheKey ?? _generateKeyFromUrl(imageUrl);
cacheManager ??= DefaultCacheManager();
return cacheManager.removeFile(key);
}
static Future<void> clearCache({BaseCacheManager? cacheManager}) {
cacheManager ??= DefaultCacheManager();
return cacheManager.emptyCache();
}
static String _generateKeyFromUrl(String url) => url.split('?').first;
}
class _CachedNetworkSVGImageState extends State<CachedNetworkSVGImage> {
bool _isLoading = false;
bool _isError = false;
String? _svgString;
late final String _cacheKey;
double? height;
late TextScaler textScaler;
static final _sizeRegExp = RegExp(
r'height="([\d\.]+)([c-x]{2})?"',
);
@override
void initState() {
super.initState();
_cacheKey =
widget._cacheKey ??
CachedNetworkSVGImage._generateKeyFromUrl(widget._url);
_loadImage();
}
@override
void didChangeDependencies() {
super.didChangeDependencies();
textScaler = MediaQuery.textScalerOf(context);
}
Future<void> _loadImage() async {
try {
var file = (await widget._cacheManager.getFileFromMemory(
_cacheKey,
))?.file;
file ??= await widget._cacheManager.getSingleFile(
widget._url,
key: _cacheKey,
headers: widget._headers ?? {},
);
final svg = await file.readAsString();
_svgString = svg;
if (widget._width == null && widget._height == null) {
final match = _sizeRegExp.firstMatch(svg);
if (match != null) {
double h = double.parse(match.group(1)!);
final suffix = match.group(2);
if (suffix != null) {
h *= switch (suffix) {
'em' => textScaler.scale(widget._theme.fontSize),
'ex' => textScaler.scale(widget._theme.xHeight),
'pt' => 1.25,
'pc' => 15.0,
'mm' => 3.543307,
'cm' => 35.43307,
'in' => 90.0,
_ => 1.0,
};
}
height = h;
}
}
_isLoading = false;
_setState();
} catch (e) {
log('CachedNetworkSVGImage: $e');
_isError = true;
_isLoading = false;
_setState();
}
}
void _setState() {
if (mounted) {
setState(() {});
} else {
SchedulerBinding.instance.addPostFrameCallback((_) => setState(() {}));
}
}
@override
void dispose() {
super.dispose();
}
@override
Widget build(BuildContext context) {
return SizedBox(
width: widget._width,
height: widget._height,
child: _buildImage(),
);
}
Widget? _buildImage() {
if (_isLoading) return _buildPlaceholderWidget();
if (_isError) return _buildErrorWidget();
return _buildSVGImage();
}
Widget _buildPlaceholderWidget() => Center(child: widget._placeholder);
Widget _buildErrorWidget() => Center(child: widget._errorWidget);
Widget? _buildSVGImage() {
if (_svgString == null) {
return Center(child: widget._placeholderBuilder?.call(context));
}
return SvgPicture.string(
_svgString!,
fit: widget._fit,
width: widget._width,
height: widget._height ?? height,
alignment: widget._alignment,
matchTextDirection: widget._matchTextDirection,
allowDrawingOutsideViewBox: widget._allowDrawingOutsideViewBox,
semanticsLabel: widget._semanticsLabel,
excludeFromSemantics: widget._excludeFromSemantics,
colorFilter: widget._colorFilter,
placeholderBuilder: widget._placeholderBuilder,
theme: widget._theme,
);
}
}

View File

@@ -106,32 +106,31 @@ class Request {
persistentConnection: true,
);
bool enableSystemProxy = Pref.enableSystemProxy;
final bool enableSystemProxy;
late final String systemProxyHost;
late final int? systemProxyPort;
if (enableSystemProxy) {
if (Pref.enableSystemProxy) {
systemProxyHost = Pref.systemProxyHost;
systemProxyPort = int.tryParse(Pref.systemProxyPort);
enableSystemProxy = systemProxyPort != null && systemProxyHost.isNotEmpty;
} else {
enableSystemProxy = false;
}
final http11Adapter = IOHttpClientAdapter(
createHttpClient: () {
final client = HttpClient()
..idleTimeout = const Duration(seconds: 15)
..autoUncompress = false; // Http2Adapter没有自动解压, 统一行为
// 设置代理
if (enableSystemProxy) {
client
..findProxy = ((_) => 'PROXY $systemProxyHost:$systemProxyPort')
..badCertificateCallback =
(X509Certificate cert, String host, int port) => true;
}
return client;
},
createHttpClient: enableSystemProxy
? () => HttpClient()
..idleTimeout = const Duration(seconds: 15)
..autoUncompress = false
..findProxy = ((_) => 'PROXY $systemProxyHost:$systemProxyPort')
..badCertificateCallback =
(X509Certificate cert, String host, int port) => true
: () => HttpClient()
..idleTimeout = const Duration(seconds: 15)
..autoUncompress = false, // Http2Adapter没有自动解压, 统一行为
);
late Uri proxy;
late final Uri proxy;
if (enableSystemProxy) {
proxy = Uri(
scheme: 'http',

View File

@@ -1,5 +1,6 @@
import 'dart:math';
import 'package:PiliPlus/common/widgets/cached_network_svg_image.dart';
import 'package:PiliPlus/common/widgets/image/custom_grid_view.dart';
import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
import 'package:PiliPlus/http/constants.dart';
@@ -15,7 +16,6 @@ import 'package:PiliPlus/utils/extension.dart';
import 'package:PiliPlus/utils/image_utils.dart';
import 'package:PiliPlus/utils/page_utils.dart';
import 'package:cached_network_image/cached_network_image.dart';
import 'package:cached_network_svg_image/cached_network_svg_image.dart';
import 'package:flutter/foundation.dart' show kDebugMode;
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
@@ -88,7 +88,6 @@ class OpusContent extends StatelessWidget {
child: CachedNetworkSVGImage(
cacheKey: latex,
semanticsLabel: latex,
height: 65,
'${HttpString.apiBaseUrl}/x/web-frontend/mathjax/tex?formula=${Uri.encodeComponent(latex)}',
colorFilter: ColorFilter.mode(
colorScheme.onSurfaceVariant,
@@ -96,6 +95,7 @@ class OpusContent extends StatelessWidget {
),
alignment: Alignment.centerLeft,
placeholderBuilder: (_) => Text(latex),
errorWidget: Text(latex),
),
);
default:

View File

@@ -984,7 +984,7 @@ List<SettingsModel> get extraSettings => [
TextField(
decoration: InputDecoration(
isDense: true,
labelText: systemProxyHost != ''
labelText: systemProxyHost.isNotEmpty
? systemProxyHost
: '请输入Host使用 . 分割',
border: const OutlineInputBorder(
@@ -992,16 +992,14 @@ List<SettingsModel> get extraSettings => [
),
hintText: systemProxyHost,
),
onChanged: (e) {
systemProxyHost = e;
},
onChanged: (e) => systemProxyHost = e,
),
const SizedBox(height: 10),
TextField(
keyboardType: TextInputType.number,
decoration: InputDecoration(
isDense: true,
labelText: systemProxyPort != ''
labelText: systemProxyPort.isNotEmpty
? systemProxyPort
: '请输入Port',
border: const OutlineInputBorder(
@@ -1009,9 +1007,8 @@ List<SettingsModel> get extraSettings => [
),
hintText: systemProxyPort,
),
onChanged: (e) {
systemProxyPort = e;
},
inputFormatters: [FilteringTextInputFormatter.digitsOnly],
onChanged: (e) => systemProxyPort = e,
),
],
),

View File

@@ -1,34 +1,37 @@
import 'package:PiliPlus/utils/storage_pref.dart';
import 'package:collection/collection.dart';
import 'package:flutter/material.dart';
import 'package:screen_retriever/screen_retriever.dart';
Future<Offset> calcWindowPosition(Size windowSize) async {
Display primaryDisplay = await screenRetriever.getPrimaryDisplay();
List<Display> allDisplays = await screenRetriever.getAllDisplays();
Offset cursorScreenPoint = await screenRetriever.getCursorScreenPoint();
final allDisplays = screenRetriever.getAllDisplays();
final cursorScreenPoint = await screenRetriever.getCursorScreenPoint();
Display currentDisplay = allDisplays.firstWhere(
(display) => Rect.fromLTWH(
display.visiblePosition!.dx,
display.visiblePosition!.dy,
display.size.width,
display.size.height,
).contains(cursorScreenPoint),
orElse: () => primaryDisplay,
);
final currentDisplay =
(await allDisplays).firstWhereOrNull(
(display) => (display.visiblePosition! & display.size).contains(
cursorScreenPoint,
),
) ??
await screenRetriever.getPrimaryDisplay();
num visibleWidth = currentDisplay.size.width;
num visibleHeight = currentDisplay.size.height;
num visibleStartX = 0;
num visibleStartY = 0;
if (currentDisplay.visibleSize != null) {
visibleWidth = currentDisplay.visibleSize!.width;
visibleHeight = currentDisplay.visibleSize!.height;
final double visibleWidth;
final double visibleHeight;
if (currentDisplay.visibleSize case final size?) {
visibleWidth = size.width;
visibleHeight = size.height;
} else {
visibleWidth = currentDisplay.size.width;
visibleHeight = currentDisplay.size.height;
}
if (currentDisplay.visiblePosition != null) {
visibleStartX = currentDisplay.visiblePosition!.dx;
visibleStartY = currentDisplay.visiblePosition!.dy;
final double visibleStartX;
final double visibleStartY;
if (currentDisplay.visiblePosition case final offset?) {
visibleStartX = offset.dx;
visibleStartY = offset.dy;
} else {
visibleStartX = visibleStartY = 0;
}
final windowPosition = Pref.windowPosition;

View File

@@ -5,26 +5,18 @@ packages:
dependency: transitive
description:
name: _fe_analyzer_shared
sha256: "0b2f2bd91ba804e53a61d757b986f89f1f9eaed5b11e4b2f5a2468d86d6c9fc7"
sha256: da0d9209ca76bde579f2da330aeb9df62b6319c834fa7baae052021b0462401f
url: "https://pub.dev"
source: hosted
version: "67.0.0"
version: "85.0.0"
analyzer:
dependency: transitive
description:
name: analyzer
sha256: "37577842a27e4338429a1cbc32679d508836510b056f1eedf0c8d20e39c1383d"
sha256: "974859dc0ff5f37bc4313244b3218c791810d03ab3470a579580279ba971a48d"
url: "https://pub.dev"
source: hosted
version: "6.4.1"
animations:
dependency: "direct main"
description:
name: animations
sha256: d3d6dcfb218225bbe68e87ccf6378bbb2e32a94900722c5f81611dad089911cb
url: "https://pub.dev"
source: hosted
version: "2.0.11"
version: "7.7.1"
ansicolor:
dependency: transitive
description:
@@ -158,18 +150,18 @@ packages:
dependency: transitive
description:
name: build
sha256: "80184af8b6cb3e5c1c4ec6d8544d27711700bc3e6d2efad04238c7b5290889f0"
sha256: "825fed4d63050252a0b6e74f2d75844c4a85b664814be6993bd3493fb5239779"
url: "https://pub.dev"
source: hosted
version: "2.4.1"
version: "4.0.1"
build_config:
dependency: transitive
description:
name: build_config
sha256: "4ae2de3e1e67ea270081eaee972e1bd8f027d459f249e0f1186730784c2e7e33"
sha256: "4f64382b97504dc2fcdf487d5aae33418e08b4703fc21249e4db6d804a4d0187"
url: "https://pub.dev"
source: hosted
version: "1.1.2"
version: "1.2.0"
build_daemon:
dependency: transitive
description:
@@ -178,30 +170,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "4.0.4"
build_resolvers:
dependency: transitive
description:
name: build_resolvers
sha256: "339086358431fa15d7eca8b6a36e5d783728cf025e559b834f4609a1fcfb7b0a"
url: "https://pub.dev"
source: hosted
version: "2.4.2"
build_runner:
dependency: "direct dev"
description:
name: build_runner
sha256: "028819cfb90051c6b5440c7e574d1896f8037e3c96cf17aaeb054c9311cfbf4d"
sha256: "4e54dbeefdc70691ba80b3bce3976af63b5425c8c07dface348dfee664a0edc1"
url: "https://pub.dev"
source: hosted
version: "2.4.13"
build_runner_core:
dependency: transitive
description:
name: build_runner_core
sha256: f8126682b87a7282a339b871298cc12009cb67109cfa1614d6436fb0289193e0
url: "https://pub.dev"
source: hosted
version: "7.3.2"
version: "2.9.0"
built_collection:
dependency: transitive
description:
@@ -242,14 +218,6 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.3.1"
cached_network_svg_image:
dependency: "direct main"
description:
name: cached_network_svg_image
sha256: fe9df0217c12e3903558dad14e1bb938c51296a1d96faa080415c6146bbd7a7d
url: "https://pub.dev"
source: hosted
version: "1.2.0"
canvas_danmaku:
dependency: "direct main"
description:
@@ -400,10 +368,10 @@ packages:
dependency: transitive
description:
name: dart_style
sha256: "99e066ce75c89d6b29903d788a7bb9369cf754f7b24bf70bf4b6d6d6b26853b9"
sha256: "8a0e5fba27e8ee025d2ffb4ee820b4e6e2cf5e4246a6b1a477eb66866947e0bb"
url: "https://pub.dev"
source: hosted
version: "2.3.6"
version: "3.1.1"
dbus:
dependency: transitive
description:
@@ -803,14 +771,6 @@ packages:
url: "https://pub.dev"
source: hosted
version: "10.9.0"
frontend_server_client:
dependency: transitive
description:
name: frontend_server_client
sha256: f64a0333a82f30b0cca061bc3d143813a486dc086b574bfb233b7c1372427694
url: "https://pub.dev"
source: hosted
version: "4.0.0"
get:
dependency: "direct main"
description:
@@ -867,14 +827,6 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.1.0"
hive_generator:
dependency: "direct dev"
description:
name: hive_generator
sha256: "06cb8f58ace74de61f63500564931f9505368f45f98958bd7a6c35ba24159db4"
url: "https://pub.dev"
source: hosted
version: "2.0.1"
html:
dependency: "direct main"
description:
@@ -1187,8 +1139,8 @@ packages:
description:
path: "libs/universal/media_kit_libs_video"
ref: "version_1.2.5"
resolved-ref: "4d68e69281b44f2c8e3c444cca3d8d8dc6dcff88"
url: "https://github.com/My-Responsitories/media-kit.git"
resolved-ref: "43aee19d9b2b0e33e0c9dd922b36ca6ace56de29"
url: "https://github.com/bggRGjQaUbCoE/media-kit.git"
source: git
version: "1.0.5"
media_kit_libs_windows_video:
@@ -1205,8 +1157,8 @@ packages:
description:
path: media_kit_native_event_loop
ref: "version_1.2.5"
resolved-ref: "4d68e69281b44f2c8e3c444cca3d8d8dc6dcff88"
url: "https://github.com/My-Responsitories/media-kit.git"
resolved-ref: "43aee19d9b2b0e33e0c9dd922b36ca6ace56de29"
url: "https://github.com/bggRGjQaUbCoE/media-kit.git"
source: git
version: "1.0.9"
media_kit_video:
@@ -1663,22 +1615,6 @@ packages:
description: flutter
source: sdk
version: "0.0.0"
source_gen:
dependency: transitive
description:
name: source_gen
sha256: "14658ba5f669685cd3d63701d01b31ea748310f7ab854e471962670abcf57832"
url: "https://pub.dev"
source: hosted
version: "1.5.0"
source_helper:
dependency: transitive
description:
name: source_helper
sha256: "86d247119aedce8e63f4751bd9626fc9613255935558447569ad42f9f5b48b3c"
url: "https://pub.dev"
source: hosted
version: "1.3.5"
source_span:
dependency: transitive
description:
@@ -1800,14 +1736,6 @@ packages:
url: "https://pub.dev"
source: hosted
version: "0.7.6"
timing:
dependency: transitive
description:
name: timing
sha256: "62ee18aca144e4a9f29d212f5a4c6a053be252b895ab14b5821996cff4ed90fe"
url: "https://pub.dev"
source: hosted
version: "1.0.2"
tray_manager:
dependency: "direct main"
description:

View File

@@ -38,7 +38,7 @@ dependencies:
# Use with the CupertinoIcons class for iOS style icons.
cupertino_icons: ^1.0.8
# 动态取色
dynamic_color: ^1.7.0
dynamic_color: ^1.8.1
get: ^4.6.6
@@ -125,7 +125,7 @@ dependencies:
url: https://github.com/bggRGjQaUbCoE/auto_orientation.git
ref: master
protobuf: ^5.0.0
animations: ^2.0.11
# animations: ^2.0.11
# 获取appx信息
package_info_plus: ^9.0.0
@@ -197,7 +197,6 @@ dependencies:
url: https://github.com/wgh136/webdav_client.git
ref: main
re_highlight: ^0.0.3
cached_network_svg_image: ^1.2.0
flutter_sortable_wrap:
git:
url: https://github.com/bggRGjQaUbCoE/flutter_sortable_wrap.git
@@ -251,12 +250,12 @@ dependency_overrides:
ref: version_1.2.5
media_kit_libs_video:
git:
url: https://github.com/My-Responsitories/media-kit.git
url: https://github.com/bggRGjQaUbCoE/media-kit.git
path: libs/universal/media_kit_libs_video
ref: version_1.2.5
media_kit_native_event_loop:
git:
url: https://github.com/My-Responsitories/media-kit.git
url: https://github.com/bggRGjQaUbCoE/media-kit.git
path: media_kit_native_event_loop
ref: version_1.2.5
media_kit_libs_android_video:
@@ -281,10 +280,10 @@ dev_dependencies:
# package. See that file for information about deactivating specific lint
# rules and activating additional ones.
flutter_lints: ^6.0.0
flutter_launcher_icons: ^0.14.1
hive_generator: ^2.0.1
build_runner: ^2.4.13
flutter_native_splash: ^2.4.3
flutter_launcher_icons: ^0.14.4
# hive_generator: ^2.0.1
build_runner: ^2.9.0
flutter_native_splash: ^2.4.6
flutter_launcher_icons:
android: true