upgraded Flutter to stable v3.3.3

This commit is contained in:
Thibault Deckers 2022-09-30 12:35:46 +02:00
parent 3d0e079df2
commit 034934c8d0
20 changed files with 267 additions and 122 deletions

View file

@ -17,7 +17,7 @@ jobs:
# Available versions may lag behind https://github.com/flutter/flutter.git # Available versions may lag behind https://github.com/flutter/flutter.git
- uses: subosito/flutter-action@v2 - uses: subosito/flutter-action@v2
with: with:
flutter-version: '3.3.2' flutter-version: '3.3.3'
channel: 'stable' channel: 'stable'
- name: Clone the repository. - name: Clone the repository.

View file

@ -19,7 +19,7 @@ jobs:
# Available versions may lag behind https://github.com/flutter/flutter.git # Available versions may lag behind https://github.com/flutter/flutter.git
- uses: subosito/flutter-action@v2 - uses: subosito/flutter-action@v2
with: with:
flutter-version: '3.3.2' flutter-version: '3.3.3'
channel: 'stable' channel: 'stable'
# Workaround for this Android Gradle Plugin issue (supposedly fixed in AGP 4.1): # Workaround for this Android Gradle Plugin issue (supposedly fixed in AGP 4.1):
@ -56,15 +56,15 @@ jobs:
rm release.keystore.asc rm release.keystore.asc
mkdir outputs mkdir outputs
(cd scripts/; ./apply_flavor_play.sh) (cd scripts/; ./apply_flavor_play.sh)
flutter build appbundle -t lib/main_play.dart --flavor play --bundle-sksl-path shaders_3.3.2.sksl.json flutter build appbundle -t lib/main_play.dart --flavor play --bundle-sksl-path shaders_3.3.3.sksl.json
cp build/app/outputs/bundle/playRelease/*.aab outputs cp build/app/outputs/bundle/playRelease/*.aab outputs
flutter build apk -t lib/main_play.dart --flavor play --bundle-sksl-path shaders_3.3.2.sksl.json flutter build apk -t lib/main_play.dart --flavor play --bundle-sksl-path shaders_3.3.3.sksl.json
cp build/app/outputs/apk/play/release/*.apk outputs cp build/app/outputs/apk/play/release/*.apk outputs
(cd scripts/; ./apply_flavor_huawei.sh) (cd scripts/; ./apply_flavor_huawei.sh)
flutter build apk -t lib/main_huawei.dart --flavor huawei --bundle-sksl-path shaders_3.3.2.sksl.json flutter build apk -t lib/main_huawei.dart --flavor huawei --bundle-sksl-path shaders_3.3.3.sksl.json
cp build/app/outputs/apk/huawei/release/*.apk outputs cp build/app/outputs/apk/huawei/release/*.apk outputs
(cd scripts/; ./apply_flavor_izzy.sh) (cd scripts/; ./apply_flavor_izzy.sh)
flutter build apk -t lib/main_izzy.dart --flavor izzy --split-per-abi --bundle-sksl-path shaders_3.3.2.sksl.json flutter build apk -t lib/main_izzy.dart --flavor izzy --split-per-abi --bundle-sksl-path shaders_3.3.3.sksl.json
cp build/app/outputs/apk/izzy/release/*.apk outputs cp build/app/outputs/apk/izzy/release/*.apk outputs
rm $AVES_STORE_FILE rm $AVES_STORE_FILE
env: env:

View file

@ -16,6 +16,10 @@ All notable changes to this project will be documented in this file.
- Widget: tap action setting - Widget: tap action setting
- Wallpaper: scroll effect option - Wallpaper: scroll effect option
### Changed
- upgraded Flutter to stable v3.3.3
### Fixed ### Fixed
- restoring to missing Download subdir - restoring to missing Download subdir

View file

@ -164,12 +164,12 @@ dependencies {
implementation 'com.github.deckerst:Android-TiffBitmapFactory:876e53870a' implementation 'com.github.deckerst:Android-TiffBitmapFactory:876e53870a'
// forked, built by JitPack, cf https://jitpack.io/p/deckerst/pixymeta-android // forked, built by JitPack, cf https://jitpack.io/p/deckerst/pixymeta-android
implementation 'com.github.deckerst:pixymeta-android:706bd73d6e' implementation 'com.github.deckerst:pixymeta-android:706bd73d6e'
implementation 'com.github.bumptech.glide:glide:4.13.2' implementation 'com.github.bumptech.glide:glide:4.14.1'
// huawei flavor only // huawei flavor only
huaweiImplementation 'com.huawei.agconnect:agconnect-core:1.5.2.300' huaweiImplementation 'com.huawei.agconnect:agconnect-core:1.5.2.300'
kapt 'androidx.annotation:annotation:1.4.0' kapt 'androidx.annotation:annotation:1.5.0'
kapt 'com.github.bumptech.glide:compiler:4.13.0' kapt 'com.github.bumptech.glide:compiler:4.13.0'
compileOnly rootProject.findProject(':streams_channel') compileOnly rootProject.findProject(':streams_channel')

View file

@ -21,7 +21,7 @@ class AvesAppGlideModule : AppGlideModule() {
override fun registerComponents(context: Context, glide: Glide, registry: Registry) { override fun registerComponents(context: Context, glide: Glide, registry: Registry) {
// prevent ExifInterface error logs // prevent ExifInterface error logs
// cf https://github.com/bumptech/glide/issues/3383 // cf https://github.com/bumptech/glide/issues/3383
glide.registry.imageHeaderParsers.compatRemoveIf { parser: ImageHeaderParser? -> parser is ExifInterfaceImageHeaderParser } registry.imageHeaderParsers.compatRemoveIf { parser: ImageHeaderParser? -> parser is ExifInterfaceImageHeaderParser }
} }
override fun isManifestParsingEnabled(): Boolean = false override fun isManifestParsingEnabled(): Boolean = false

View file

@ -48,7 +48,7 @@ class OverlaySnackBar extends StatelessWidget {
), ),
); );
final contentTextStyle = snackBarTheme.contentTextStyle ?? ThemeData(brightness: brightness).textTheme.subtitle1; final contentTextStyle = snackBarTheme.contentTextStyle ?? ThemeData(brightness: brightness).textTheme.titleMedium;
final horizontalPadding = FeedbackMixin.snackBarHorizontalPadding(snackBarTheme); final horizontalPadding = FeedbackMixin.snackBarHorizontalPadding(snackBarTheme);
final padding = EdgeInsetsDirectional.only(start: horizontalPadding, end: action != null ? 0 : horizontalPadding); final padding = EdgeInsetsDirectional.only(start: horizontalPadding, end: action != null ? 0 : horizontalPadding);

View file

@ -14,7 +14,7 @@ class SliverAppBarTitleWrapper extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final toolbarOpacity = context.dependOnInheritedWidgetOfExactType<FlexibleSpaceBarSettings>()!.toolbarOpacity; final toolbarOpacity = context.dependOnInheritedWidgetOfExactType<FlexibleSpaceBarSettings>()!.toolbarOpacity;
final baseColor = (DefaultTextStyle.of(context).style.color ?? Theme.of(context).textTheme.headline6!.color!); final baseColor = (DefaultTextStyle.of(context).style.color ?? Theme.of(context).textTheme.titleLarge!.color!);
return DefaultTextStyle.merge( return DefaultTextStyle.merge(
style: TextStyle(color: baseColor.withOpacity(toolbarOpacity)), style: TextStyle(color: baseColor.withOpacity(toolbarOpacity)),
child: child, child: child,

View file

@ -4,7 +4,7 @@ import 'dart:math' as math;
import 'package:flutter/gestures.dart'; import 'package:flutter/gestures.dart';
// adapted from Flutter `ScaleGestureRecognizer` in `/gestures/scale.dart` // adapted from Flutter `ScaleGestureRecognizer` in `/gestures/scale.dart`
// ignore_for_file: curly_braces_in_flow_control_structures, deprecated_member_use, unnecessary_null_comparison // ignore_for_file: avoid_types_on_closure_parameters, unnecessary_null_comparison
/// The possible states of a [ScaleGestureRecognizer]. /// The possible states of a [ScaleGestureRecognizer].
enum _ScaleState { enum _ScaleState {
@ -25,6 +25,17 @@ enum _ScaleState {
started, started,
} }
class _PointerPanZoomData {
_PointerPanZoomData({required this.focalPoint, required this.scale, required this.rotation});
Offset focalPoint;
double scale;
double rotation;
@override
String toString() => '_PointerPanZoomData(focalPoint: $focalPoint, scale: $scale, angle: $rotation)';
}
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
bool _isFlingGesture(Velocity velocity) { bool _isFlingGesture(Velocity velocity) {
@ -71,20 +82,15 @@ class EagerScaleGestureRecognizer extends OneSequenceGestureRecognizer {
/// ///
/// {@macro flutter.gestures.GestureRecognizer.supportedDevices} /// {@macro flutter.gestures.GestureRecognizer.supportedDevices}
EagerScaleGestureRecognizer({ EagerScaleGestureRecognizer({
Object? debugOwner, super.debugOwner,
@Deprecated( @Deprecated(
'Migrate to supportedDevices. ' 'Migrate to supportedDevices. '
'This feature was deprecated after v2.3.0-1.0.pre.', 'This feature was deprecated after v2.3.0-1.0.pre.',
) )
PointerDeviceKind? kind, super.kind,
Set<PointerDeviceKind>? supportedDevices, super.supportedDevices,
this.dragStartBehavior = DragStartBehavior.down, this.dragStartBehavior = DragStartBehavior.down,
}) : assert(dragStartBehavior != null), }) : assert(dragStartBehavior != null);
super(
debugOwner: debugOwner,
kind: kind,
supportedDevices: supportedDevices,
);
/// Determines what point is used as the starting point in all calculations /// Determines what point is used as the starting point in all calculations
/// involving this gesture. /// involving this gesture.
@ -142,21 +148,51 @@ class EagerScaleGestureRecognizer extends OneSequenceGestureRecognizer {
late Offset _localFocalPoint; late Offset _localFocalPoint;
_LineBetweenPointers? _initialLine; _LineBetweenPointers? _initialLine;
_LineBetweenPointers? _currentLine; _LineBetweenPointers? _currentLine;
late Map<int, Offset> _pointerLocations; final Map<int, Offset> _pointerLocations = <int, Offset>{};
late List<int> _pointerQueue; // A queue to sort pointers in order of entrance final List<int> _pointerQueue = <int>[]; // A queue to sort pointers in order of entrance
final Map<int, VelocityTracker> _velocityTrackers = <int, VelocityTracker>{}; final Map<int, VelocityTracker> _velocityTrackers = <int, VelocityTracker>{};
late Offset _delta; late Offset _delta;
final Map<int, _PointerPanZoomData> _pointerPanZooms = <int, _PointerPanZoomData>{};
double _initialPanZoomScaleFactor = 1;
double _initialPanZoomRotationFactor = 0;
double get _scaleFactor => _initialSpan > 0.0 ? _currentSpan / _initialSpan : 1.0; double get _pointerScaleFactor => _initialSpan > 0.0 ? _currentSpan / _initialSpan : 1.0;
double get _horizontalScaleFactor => _initialHorizontalSpan > 0.0 ? _currentHorizontalSpan / _initialHorizontalSpan : 1.0; double get _pointerHorizontalScaleFactor => _initialHorizontalSpan > 0.0 ? _currentHorizontalSpan / _initialHorizontalSpan : 1.0;
double get _verticalScaleFactor => _initialVerticalSpan > 0.0 ? _currentVerticalSpan / _initialVerticalSpan : 1.0; double get _pointerVerticalScaleFactor => _initialVerticalSpan > 0.0 ? _currentVerticalSpan / _initialVerticalSpan : 1.0;
double get _scaleFactor {
double scale = _pointerScaleFactor;
for (final _PointerPanZoomData p in _pointerPanZooms.values) {
scale *= p.scale / _initialPanZoomScaleFactor;
}
return scale;
}
double get _horizontalScaleFactor {
double scale = _pointerHorizontalScaleFactor;
for (final _PointerPanZoomData p in _pointerPanZooms.values) {
scale *= p.scale / _initialPanZoomScaleFactor;
}
return scale;
}
double get _verticalScaleFactor {
double scale = _pointerVerticalScaleFactor;
for (final _PointerPanZoomData p in _pointerPanZooms.values) {
scale *= p.scale / _initialPanZoomScaleFactor;
}
return scale;
}
int get _pointerCount {
return _pointerPanZooms.length + _pointerQueue.length;
}
double _computeRotationFactor() { double _computeRotationFactor() {
if (_initialLine == null || _currentLine == null) { double factor = 0.0;
return 0.0; if (_initialLine != null && _currentLine != null) {
}
final double fx = _initialLine!.pointerStartLocation.dx; final double fx = _initialLine!.pointerStartLocation.dx;
final double fy = _initialLine!.pointerStartLocation.dy; final double fy = _initialLine!.pointerStartLocation.dy;
final double sx = _initialLine!.pointerEndLocation.dx; final double sx = _initialLine!.pointerEndLocation.dx;
@ -170,7 +206,13 @@ class EagerScaleGestureRecognizer extends OneSequenceGestureRecognizer {
final double angle1 = math.atan2(fy - sy, fx - sx); final double angle1 = math.atan2(fy - sy, fx - sx);
final double angle2 = math.atan2(nfy - nsy, nfx - nsx); final double angle2 = math.atan2(nfy - nsy, nfx - nsx);
return angle2 - angle1; factor = angle2 - angle1;
}
for (final _PointerPanZoomData p in _pointerPanZooms.values) {
factor += p.rotation;
}
factor -= _initialPanZoomRotationFactor;
return factor;
} }
@override @override
@ -185,8 +227,21 @@ class EagerScaleGestureRecognizer extends OneSequenceGestureRecognizer {
_currentHorizontalSpan = 0.0; _currentHorizontalSpan = 0.0;
_initialVerticalSpan = 0.0; _initialVerticalSpan = 0.0;
_currentVerticalSpan = 0.0; _currentVerticalSpan = 0.0;
_pointerLocations = <int, Offset>{}; }
_pointerQueue = <int>[]; }
@override
bool isPointerPanZoomAllowed(PointerPanZoomStartEvent event) => true;
@override
void addAllowedPointerPanZoom(PointerPanZoomStartEvent event) {
super.addAllowedPointerPanZoom(event);
startTrackingPointer(event.pointer, event.transform);
_velocityTrackers[event.pointer] = VelocityTracker.withKind(event.kind);
if (_state == _ScaleState.ready) {
_state = _ScaleState.possible;
_initialPanZoomScaleFactor = 1.0;
_initialPanZoomRotationFactor = 0.0;
} }
} }
@ -197,7 +252,9 @@ class EagerScaleGestureRecognizer extends OneSequenceGestureRecognizer {
bool shouldStartIfAccepted = false; bool shouldStartIfAccepted = false;
if (event is PointerMoveEvent) { if (event is PointerMoveEvent) {
final VelocityTracker tracker = _velocityTrackers[event.pointer]!; final VelocityTracker tracker = _velocityTrackers[event.pointer]!;
if (!event.synthesized) tracker.addPosition(event.timeStamp, event.position); if (!event.synthesized) {
tracker.addPosition(event.timeStamp, event.position);
}
_pointerLocations[event.pointer] = event.position; _pointerLocations[event.pointer] = event.position;
shouldStartIfAccepted = true; shouldStartIfAccepted = true;
_lastTransform = event.transform; _lastTransform = event.transform;
@ -212,24 +269,46 @@ class EagerScaleGestureRecognizer extends OneSequenceGestureRecognizer {
_pointerQueue.remove(event.pointer); _pointerQueue.remove(event.pointer);
didChangeConfiguration = true; didChangeConfiguration = true;
_lastTransform = event.transform; _lastTransform = event.transform;
} else if (event is PointerPanZoomStartEvent) {
assert(_pointerPanZooms[event.pointer] == null);
_pointerPanZooms[event.pointer] = _PointerPanZoomData(focalPoint: event.position, scale: 1, rotation: 0);
didChangeConfiguration = true;
shouldStartIfAccepted = true;
} else if (event is PointerPanZoomUpdateEvent) {
assert(_pointerPanZooms[event.pointer] != null);
if (!event.synthesized) {
_velocityTrackers[event.pointer]!.addPosition(event.timeStamp, event.pan);
}
_pointerPanZooms[event.pointer] = _PointerPanZoomData(focalPoint: event.position + event.pan, scale: event.scale, rotation: event.rotation);
_lastTransform = event.transform;
shouldStartIfAccepted = true;
} else if (event is PointerPanZoomEndEvent) {
assert(_pointerPanZooms[event.pointer] != null);
_pointerPanZooms.remove(event.pointer);
didChangeConfiguration = true;
} }
_updateLines(); _updateLines();
_update(); _update();
if (!didChangeConfiguration || _reconfigure(event.pointer)) _advanceStateMachine(shouldStartIfAccepted, event.kind); if (!didChangeConfiguration || _reconfigure(event.pointer)) {
_advanceStateMachine(shouldStartIfAccepted, event.kind);
}
stopTrackingIfPointerNoLongerDown(event); stopTrackingIfPointerNoLongerDown(event);
} }
void _update() { void _update() {
final int count = _pointerLocations.keys.length;
final Offset? previousFocalPoint = _currentFocalPoint; final Offset? previousFocalPoint = _currentFocalPoint;
// Compute the focal point // Compute the focal point
Offset focalPoint = Offset.zero; Offset focalPoint = Offset.zero;
for (final int pointer in _pointerLocations.keys) focalPoint += _pointerLocations[pointer]!; for (final int pointer in _pointerLocations.keys) {
_currentFocalPoint = count > 0 ? focalPoint / count.toDouble() : Offset.zero; focalPoint += _pointerLocations[pointer]!;
}
for (final _PointerPanZoomData p in _pointerPanZooms.values) {
focalPoint += p.focalPoint;
}
_currentFocalPoint = _pointerCount > 0 ? focalPoint / _pointerCount.toDouble() : Offset.zero;
if (previousFocalPoint == null) { if (previousFocalPoint == null) {
_localFocalPoint = PointerEvent.transformPosition( _localFocalPoint = PointerEvent.transformPosition(
@ -246,6 +325,16 @@ class EagerScaleGestureRecognizer extends OneSequenceGestureRecognizer {
_delta = _localFocalPoint - localPreviousFocalPoint; _delta = _localFocalPoint - localPreviousFocalPoint;
} }
final int count = _pointerLocations.keys.length;
Offset pointerFocalPoint = Offset.zero;
for (final int pointer in _pointerLocations.keys) {
pointerFocalPoint += _pointerLocations[pointer]!;
}
if (count > 0) {
pointerFocalPoint = pointerFocalPoint / count.toDouble();
}
// Span is the average deviation from focal point. Horizontal and vertical // Span is the average deviation from focal point. Horizontal and vertical
// spans are the average deviations from the focal point's horizontal and // spans are the average deviations from the focal point's horizontal and
// vertical coordinates, respectively. // vertical coordinates, respectively.
@ -253,9 +342,9 @@ class EagerScaleGestureRecognizer extends OneSequenceGestureRecognizer {
double totalHorizontalDeviation = 0.0; double totalHorizontalDeviation = 0.0;
double totalVerticalDeviation = 0.0; double totalVerticalDeviation = 0.0;
for (final int pointer in _pointerLocations.keys) { for (final int pointer in _pointerLocations.keys) {
totalDeviation += (_currentFocalPoint! - _pointerLocations[pointer]!).distance; totalDeviation += (pointerFocalPoint - _pointerLocations[pointer]!).distance;
totalHorizontalDeviation += (_currentFocalPoint!.dx - _pointerLocations[pointer]!.dx).abs(); totalHorizontalDeviation += (pointerFocalPoint.dx - _pointerLocations[pointer]!.dx).abs();
totalVerticalDeviation += (_currentFocalPoint!.dy - _pointerLocations[pointer]!.dy).abs(); totalVerticalDeviation += (pointerFocalPoint.dy - _pointerLocations[pointer]!.dy).abs();
} }
_currentSpan = count > 0 ? totalDeviation / count : 0.0; _currentSpan = count > 0 ? totalDeviation / count : 0.0;
_currentHorizontalSpan = count > 0 ? totalHorizontalDeviation / count : 0.0; _currentHorizontalSpan = count > 0 ? totalHorizontalDeviation / count : 0.0;
@ -297,6 +386,13 @@ class EagerScaleGestureRecognizer extends OneSequenceGestureRecognizer {
_initialLine = _currentLine; _initialLine = _currentLine;
_initialHorizontalSpan = _currentHorizontalSpan; _initialHorizontalSpan = _currentHorizontalSpan;
_initialVerticalSpan = _currentVerticalSpan; _initialVerticalSpan = _currentVerticalSpan;
if (_pointerPanZooms.isEmpty) {
_initialPanZoomScaleFactor = 1.0;
_initialPanZoomRotationFactor = 0.0;
} else {
_initialPanZoomScaleFactor = _scaleFactor / _pointerScaleFactor;
_initialPanZoomRotationFactor = _pointerPanZooms.values.map((_PointerPanZoomData x) => x.rotation).reduce((double a, double b) => a + b);
}
if (_state == _ScaleState.started) { if (_state == _ScaleState.started) {
if (onEnd != null) { if (onEnd != null) {
final VelocityTracker tracker = _velocityTrackers[pointer]!; final VelocityTracker tracker = _velocityTrackers[pointer]!;
@ -304,10 +400,12 @@ class EagerScaleGestureRecognizer extends OneSequenceGestureRecognizer {
Velocity velocity = tracker.getVelocity(); Velocity velocity = tracker.getVelocity();
if (_isFlingGesture(velocity)) { if (_isFlingGesture(velocity)) {
final Offset pixelsPerSecond = velocity.pixelsPerSecond; final Offset pixelsPerSecond = velocity.pixelsPerSecond;
if (pixelsPerSecond.distanceSquared > kMaxFlingVelocity * kMaxFlingVelocity) velocity = Velocity(pixelsPerSecond: (pixelsPerSecond / pixelsPerSecond.distance) * kMaxFlingVelocity); if (pixelsPerSecond.distanceSquared > kMaxFlingVelocity * kMaxFlingVelocity) {
invokeCallback<void>('onEnd', () => onEnd!(ScaleEndDetails(velocity: velocity, pointerCount: _pointerQueue.length))); velocity = Velocity(pixelsPerSecond: (pixelsPerSecond / pixelsPerSecond.distance) * kMaxFlingVelocity);
}
invokeCallback<void>('onEnd', () => onEnd!(ScaleEndDetails(velocity: velocity, pointerCount: _pointerCount)));
} else { } else {
invokeCallback<void>('onEnd', () => onEnd!(ScaleEndDetails(pointerCount: _pointerQueue.length))); invokeCallback<void>('onEnd', () => onEnd!(ScaleEndDetails(pointerCount: _pointerCount)));
} }
} }
_state = _ScaleState.accepted; _state = _ScaleState.accepted;
@ -317,7 +415,9 @@ class EagerScaleGestureRecognizer extends OneSequenceGestureRecognizer {
} }
void _advanceStateMachine(bool shouldStartIfAccepted, PointerDeviceKind pointerDeviceKind) { void _advanceStateMachine(bool shouldStartIfAccepted, PointerDeviceKind pointerDeviceKind) {
if (_state == _ScaleState.ready) _state = _ScaleState.possible; if (_state == _ScaleState.ready) {
_state = _ScaleState.possible;
}
// TLAD insert start // TLAD insert start
if (_pointerQueue.length == 2) { if (_pointerQueue.length == 2) {
@ -328,7 +428,9 @@ class EagerScaleGestureRecognizer extends OneSequenceGestureRecognizer {
if (_state == _ScaleState.possible) { if (_state == _ScaleState.possible) {
final double spanDelta = (_currentSpan - _initialSpan).abs(); final double spanDelta = (_currentSpan - _initialSpan).abs();
final double focalPointDelta = (_currentFocalPoint! - _initialFocalPoint).distance; final double focalPointDelta = (_currentFocalPoint! - _initialFocalPoint).distance;
if (spanDelta > computeScaleSlop(pointerDeviceKind) || focalPointDelta > computePanSlop(pointerDeviceKind, gestureSettings)) resolve(GestureDisposition.accepted); if (spanDelta > computeScaleSlop(pointerDeviceKind) || focalPointDelta > computePanSlop(pointerDeviceKind, gestureSettings) || math.max(_scaleFactor / _pointerScaleFactor, _pointerScaleFactor / _scaleFactor) > 1.05) {
resolve(GestureDisposition.accepted);
}
} else if (_state.index >= _ScaleState.accepted.index) { } else if (_state.index >= _ScaleState.accepted.index) {
resolve(GestureDisposition.accepted); resolve(GestureDisposition.accepted);
} }
@ -338,7 +440,7 @@ class EagerScaleGestureRecognizer extends OneSequenceGestureRecognizer {
_dispatchOnStartCallbackIfNeeded(); _dispatchOnStartCallbackIfNeeded();
} }
if (_state == _ScaleState.started && onUpdate != null) if (_state == _ScaleState.started && onUpdate != null) {
invokeCallback<void>('onUpdate', () { invokeCallback<void>('onUpdate', () {
onUpdate!(ScaleUpdateDetails( onUpdate!(ScaleUpdateDetails(
scale: _scaleFactor, scale: _scaleFactor,
@ -347,23 +449,25 @@ class EagerScaleGestureRecognizer extends OneSequenceGestureRecognizer {
focalPoint: _currentFocalPoint!, focalPoint: _currentFocalPoint!,
localFocalPoint: _localFocalPoint, localFocalPoint: _localFocalPoint,
rotation: _computeRotationFactor(), rotation: _computeRotationFactor(),
pointerCount: _pointerQueue.length, pointerCount: _pointerCount,
focalPointDelta: _delta, focalPointDelta: _delta,
)); ));
}); });
} }
}
void _dispatchOnStartCallbackIfNeeded() { void _dispatchOnStartCallbackIfNeeded() {
assert(_state == _ScaleState.started); assert(_state == _ScaleState.started);
if (onStart != null) if (onStart != null) {
invokeCallback<void>('onStart', () { invokeCallback<void>('onStart', () {
onStart!(ScaleStartDetails( onStart!(ScaleStartDetails(
focalPoint: _currentFocalPoint!, focalPoint: _currentFocalPoint!,
localFocalPoint: _localFocalPoint, localFocalPoint: _localFocalPoint,
pointerCount: _pointerQueue.length, pointerCount: _pointerCount,
)); ));
}); });
} }
}
@override @override
void acceptGesture(int pointer) { void acceptGesture(int pointer) {
@ -376,12 +480,22 @@ class EagerScaleGestureRecognizer extends OneSequenceGestureRecognizer {
_initialLine = _currentLine; _initialLine = _currentLine;
_initialHorizontalSpan = _currentHorizontalSpan; _initialHorizontalSpan = _currentHorizontalSpan;
_initialVerticalSpan = _currentVerticalSpan; _initialVerticalSpan = _currentVerticalSpan;
if (_pointerPanZooms.isEmpty) {
_initialPanZoomScaleFactor = 1.0;
_initialPanZoomRotationFactor = 0.0;
} else {
_initialPanZoomScaleFactor = _scaleFactor / _pointerScaleFactor;
_initialPanZoomRotationFactor = _pointerPanZooms.values.map((_PointerPanZoomData x) => x.rotation).reduce((double a, double b) => a + b);
}
} }
} }
} }
@override @override
void rejectGesture(int pointer) { void rejectGesture(int pointer) {
_pointerPanZooms.remove(pointer);
_pointerLocations.remove(pointer);
_pointerQueue.remove(pointer);
stopTrackingPointer(pointer); stopTrackingPointer(pointer);
} }

View file

@ -3,7 +3,8 @@ import 'dart:ui' as ui;
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
// adapted from Flutter `RawImage`, `paintImage()` from `DecorationImagePainter`, etc. // adapted from Flutter `_ImageState` in `/widgets/image.dart`
// and `DecorationImagePainter` in `/painting/decoration_image.dart`
// to transition between 2 different fits during hero animation: // to transition between 2 different fits during hero animation:
// - BoxFit.cover at t=0 // - BoxFit.cover at t=0
// - BoxFit.contain at t=1 // - BoxFit.contain at t=1
@ -34,11 +35,6 @@ class _TransitionImageState extends State<TransitionImage> {
bool _isListeningToStream = false; bool _isListeningToStream = false;
int? _frameNumber; int? _frameNumber;
@override
void initState() {
super.initState();
}
@override @override
void dispose() { void dispose() {
assert(_imageStream != null); assert(_imageStream != null);
@ -63,8 +59,9 @@ class _TransitionImageState extends State<TransitionImage> {
void didUpdateWidget(covariant TransitionImage oldWidget) { void didUpdateWidget(covariant TransitionImage oldWidget) {
super.didUpdateWidget(oldWidget); super.didUpdateWidget(oldWidget);
if (_isListeningToStream) { if (_isListeningToStream) {
_imageStream!.removeListener(_getListener()); final ImageStreamListener oldListener = _getListener();
_imageStream!.addListener(_getListener()); _imageStream!.addListener(_getListener(recreateListener: true));
_imageStream!.removeListener(oldListener);
} }
if (widget.image != oldWidget.image) _resolveImage(); if (widget.image != oldWidget.image) _resolveImage();
} }
@ -84,31 +81,41 @@ class _TransitionImageState extends State<TransitionImage> {
_updateSourceStream(newStream); _updateSourceStream(newStream);
} }
ImageStreamListener _getListener() { ImageStreamListener? _imageStreamListener;
return ImageStreamListener(
ImageStreamListener _getListener({bool recreateListener = false}) {
if (_imageStreamListener == null || recreateListener) {
_imageStreamListener = ImageStreamListener(
_handleImageFrame, _handleImageFrame,
onChunk: null,
); );
} }
return _imageStreamListener!;
}
void _handleImageFrame(ImageInfo imageInfo, bool synchronousCall) { void _handleImageFrame(ImageInfo imageInfo, bool synchronousCall) {
setState(() { setState(() {
_imageInfo = imageInfo; _replaceImage(info: imageInfo);
_frameNumber = _frameNumber == null ? 0 : _frameNumber! + 1; _frameNumber = _frameNumber == null ? 0 : _frameNumber! + 1;
}); });
} }
// Updates _imageStream to newStream, and moves the stream listener void _replaceImage({required ImageInfo? info}) {
// registration from the old stream to the new stream (if a listener was _imageInfo?.dispose();
// registered). _imageInfo = info;
void _updateSourceStream(ImageStream newStream) { }
if (_imageStream?.key == newStream.key) return;
if (_isListeningToStream) _imageStream!.removeListener(_getListener()); void _updateSourceStream(ImageStream newStream) {
if (_imageStream?.key == newStream.key) {
return;
}
if (_isListeningToStream) {
_imageStream!.removeListener(_getListener());
}
if (!widget.gaplessPlayback) { if (!widget.gaplessPlayback) {
setState(() { setState(() {
_imageInfo = null; _replaceImage(info: null);
}); });
} }
@ -117,17 +124,26 @@ class _TransitionImageState extends State<TransitionImage> {
}); });
_imageStream = newStream; _imageStream = newStream;
if (_isListeningToStream) _imageStream!.addListener(_getListener()); if (_isListeningToStream) {
_imageStream!.addListener(_getListener());
}
} }
void _listenToStream() { void _listenToStream() {
if (_isListeningToStream) return; if (_isListeningToStream) {
return;
}
_imageStream!.addListener(_getListener()); _imageStream!.addListener(_getListener());
_isListeningToStream = true; _isListeningToStream = true;
} }
void _stopListeningToStream() { void _stopListeningToStream() {
if (!_isListeningToStream) return; if (!_isListeningToStream) {
return;
}
_imageStream!.removeListener(_getListener()); _imageStream!.removeListener(_getListener());
_isListeningToStream = false; _isListeningToStream = false;
} }

View file

@ -11,7 +11,7 @@ import 'package:provider/provider.dart';
// Use a `SliverList` instead of multiple `SliverGrid` because having one `SliverGrid` per section does not scale up. // Use a `SliverList` instead of multiple `SliverGrid` because having one `SliverGrid` per section does not scale up.
// With the multiple `SliverGrid` solution, thumbnails at the beginning of each sections are built even though they are offscreen // With the multiple `SliverGrid` solution, thumbnails at the beginning of each sections are built even though they are offscreen
// because of `RenderSliverMultiBoxAdaptor.addInitialChild` called by `RenderSliverGrid.performLayout` (line 547), as of Flutter v1.17.0. // because of `RenderSliverMultiBoxAdaptor.addInitialChild` called by `RenderSliverGrid.performLayout` (line 591), as of Flutter v3.3.3.
// cf https://github.com/flutter/flutter/issues/49027 // cf https://github.com/flutter/flutter/issues/49027
// adapted from Flutter `RenderSliverFixedExtentBoxAdaptor` in `/rendering/sliver_fixed_extent_list.dart` // adapted from Flutter `RenderSliverFixedExtentBoxAdaptor` in `/rendering/sliver_fixed_extent_list.dart`
class SectionedListSliver<T> extends StatelessWidget { class SectionedListSliver<T> extends StatelessWidget {

View file

@ -18,7 +18,7 @@ abstract class AvesSearchDelegate extends SearchDelegate {
} }
@override @override
Widget buildLeading(BuildContext context) { Widget? buildLeading(BuildContext context) {
// use a property instead of checking `Navigator.canPop(context)` // use a property instead of checking `Navigator.canPop(context)`
// because the navigator state changes as soon as we press back // because the navigator state changes as soon as we press back
// so the leading may mistakenly switch to the close button // so the leading may mistakenly switch to the close button
@ -37,7 +37,7 @@ abstract class AvesSearchDelegate extends SearchDelegate {
} }
@override @override
List<Widget> buildActions(BuildContext context) { List<Widget>? buildActions(BuildContext context) {
return [ return [
if (query.isNotEmpty) if (query.isNotEmpty)
IconButton( IconButton(
@ -91,6 +91,9 @@ abstract class AvesSearchDelegate extends SearchDelegate {
@override @override
set query(String value) { set query(String value) {
queryTextController.text = value; queryTextController.text = value;
if (queryTextController.text.isNotEmpty) {
queryTextController.selection = TextSelection.fromPosition(TextPosition(offset: queryTextController.text.length));
}
} }
final ValueNotifier<SearchBody?> currentBodyNotifier = ValueNotifier(null); final ValueNotifier<SearchBody?> currentBodyNotifier = ValueNotifier(null);

View file

@ -138,7 +138,7 @@ class _SearchPageState extends State<SearchPage> {
hintStyle: theme.inputDecorationTheme.hintStyle, hintStyle: theme.inputDecorationTheme.hintStyle,
), ),
textInputAction: TextInputAction.search, textInputAction: TextInputAction.search,
style: theme.textTheme.headline6, style: theme.textTheme.titleLarge,
onSubmitted: (_) => widget.delegate.showResults(context), onSubmitted: (_) => widget.delegate.showResults(context),
), ),
), ),

View file

@ -14,7 +14,7 @@ class SearchPageRoute<T> extends PageRoute<T> {
delegate.route == null, delegate.route == null,
'The ${delegate.runtimeType} instance is currently used by another active ' 'The ${delegate.runtimeType} instance is currently used by another active '
'search. Please close that search by calling close() on the SearchDelegate ' 'search. Please close that search by calling close() on the SearchDelegate '
'before openening another search with the same delegate instance.', 'before opening another search with the same delegate instance.',
); );
delegate.route = this; delegate.route = this;
} }

View file

@ -157,7 +157,7 @@ class _FilePickerState extends State<FilePicker> {
padding: const EdgeInsets.all(16), padding: const EdgeInsets.all(16),
child: Text( child: Text(
context.l10n.filePickerOpenFrom, context.l10n.filePickerOpenFrom,
style: Theme.of(context).textTheme.headline5, style: Theme.of(context).textTheme.headlineSmall,
), ),
), ),
...volumes.map((v) { ...volumes.map((v) {

View file

@ -24,7 +24,7 @@ class InfoSearchDelegate extends SearchDelegate {
); );
@override @override
Widget buildLeading(BuildContext context) { Widget? buildLeading(BuildContext context) {
return IconButton( return IconButton(
icon: AnimatedIcon( icon: AnimatedIcon(
icon: AnimatedIcons.menu_arrow, icon: AnimatedIcons.menu_arrow,
@ -36,7 +36,7 @@ class InfoSearchDelegate extends SearchDelegate {
} }
@override @override
List<Widget> buildActions(BuildContext context) { List<Widget>? buildActions(BuildContext context) {
return [ return [
if (query.isNotEmpty) if (query.isNotEmpty)
IconButton( IconButton(

View file

@ -116,7 +116,7 @@ class _WelcomePageState extends State<WelcomePage> {
List<Widget> _buildHeader(BuildContext context, {required bool isPortrait}) { List<Widget> _buildHeader(BuildContext context, {required bool isPortrait}) {
final message = Text( final message = Text(
context.l10n.welcomeMessage, context.l10n.welcomeMessage,
style: Theme.of(context).textTheme.headline5, style: Theme.of(context).textTheme.headlineSmall,
); );
final padding = isPortrait ? 16.0 : 8.0; final padding = isPortrait ? 16.0 : 8.0;
return [ return [

View file

@ -154,7 +154,7 @@ packages:
name: connectivity_plus_web name: connectivity_plus_web
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.2.3" version: "1.2.4"
connectivity_plus_windows: connectivity_plus_windows:
dependency: transitive dependency: transitive
description: description:
@ -319,7 +319,7 @@ packages:
name: firebase_core name: firebase_core
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.22.0" version: "1.23.0"
firebase_core_platform_interface: firebase_core_platform_interface:
dependency: transitive dependency: transitive
description: description:
@ -340,14 +340,14 @@ packages:
name: firebase_crashlytics name: firebase_crashlytics
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.8.10" version: "2.8.11"
firebase_crashlytics_platform_interface: firebase_crashlytics_platform_interface:
dependency: transitive dependency: transitive
description: description:
name: firebase_crashlytics_platform_interface name: firebase_crashlytics_platform_interface
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "3.2.16" version: "3.2.17"
flex_color_picker: flex_color_picker:
dependency: "direct main" dependency: "direct main"
description: description:
@ -489,28 +489,28 @@ packages:
name: google_maps_flutter name: google_maps_flutter
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.2.0" version: "2.2.1"
google_maps_flutter_android: google_maps_flutter_android:
dependency: transitive dependency: transitive
description: description:
name: google_maps_flutter_android name: google_maps_flutter_android
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.3.0" version: "2.3.1"
google_maps_flutter_ios: google_maps_flutter_ios:
dependency: transitive dependency: transitive
description: description:
name: google_maps_flutter_ios name: google_maps_flutter_ios
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.1.11" version: "2.1.12"
google_maps_flutter_platform_interface: google_maps_flutter_platform_interface:
dependency: transitive dependency: transitive
description: description:
name: google_maps_flutter_platform_interface name: google_maps_flutter_platform_interface
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.2.2" version: "2.2.4"
highlight: highlight:
dependency: transitive dependency: transitive
description: description:
@ -601,7 +601,7 @@ packages:
name: markdown name: markdown
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "6.0.0" version: "6.0.1"
matcher: matcher:
dependency: transitive dependency: transitive
description: description:
@ -771,7 +771,7 @@ packages:
name: path_provider_platform_interface name: path_provider_platform_interface
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.4" version: "2.0.5"
path_provider_windows: path_provider_windows:
dependency: transitive dependency: transitive
description: description:
@ -799,7 +799,7 @@ packages:
name: permission_handler name: permission_handler
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "10.0.0" version: "10.0.2"
permission_handler_android: permission_handler_android:
dependency: "direct overridden" dependency: "direct overridden"
description: description:
@ -822,7 +822,7 @@ packages:
name: permission_handler_platform_interface name: permission_handler_platform_interface
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "3.7.0" version: "3.8.0"
permission_handler_windows: permission_handler_windows:
dependency: transitive dependency: transitive
description: description:
@ -850,7 +850,7 @@ packages:
name: plugin_platform_interface name: plugin_platform_interface
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.1.2" version: "2.1.3"
polylabel: polylabel:
dependency: transitive dependency: transitive
description: description:
@ -927,7 +927,7 @@ packages:
name: screen_brightness name: screen_brightness
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.2.1" version: "0.2.2"
screen_brightness_android: screen_brightness_android:
dependency: transitive dependency: transitive
description: description:
@ -956,6 +956,13 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.1.0" version: "0.1.0"
screen_brightness_windows:
dependency: transitive
description:
name: screen_brightness_windows
url: "https://pub.dartlang.org"
source: hosted
version: "0.1.0"
shared_preferences: shared_preferences:
dependency: "direct main" dependency: "direct main"
description: description:
@ -1018,7 +1025,7 @@ packages:
name: shelf name: shelf
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.3.2" version: "1.4.0"
shelf_packages_handler: shelf_packages_handler:
dependency: transitive dependency: transitive
description: description:
@ -1079,14 +1086,14 @@ packages:
name: sqflite name: sqflite
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.3+1" version: "2.1.0"
sqflite_common: sqflite_common:
dependency: transitive dependency: transitive
description: description:
name: sqflite_common name: sqflite_common
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.2.1+1" version: "2.3.0"
stack_trace: stack_trace:
dependency: transitive dependency: transitive
description: description:
@ -1200,7 +1207,7 @@ packages:
name: url_launcher name: url_launcher
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "6.1.5" version: "6.1.6"
url_launcher_android: url_launcher_android:
dependency: transitive dependency: transitive
description: description:
@ -1235,7 +1242,7 @@ packages:
name: url_launcher_platform_interface name: url_launcher_platform_interface
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.1.0" version: "2.1.1"
url_launcher_web: url_launcher_web:
dependency: transitive dependency: transitive
description: description:

View file

@ -154,22 +154,23 @@ flutter:
# adapts from package `flutter_highlight` v0.7.0 # adapts from package `flutter_highlight` v0.7.0
# #
# `OutputBuffer` in `/services/common/output_buffer.dart` # `OutputBuffer` in `/services/common/output_buffer.dart`
# adapts from Flutter `_OutputBuffer` in `/foundation/consolidate_response.dart` # adapts from Flutter v3.3.3 `_OutputBuffer` in `/foundation/consolidate_response.dart`
# #
# `OverlaySnackBar` in `/widgets/common/action_mixins/overlay_snack_bar.dart` # `OverlaySnackBar` in `/widgets/common/action_mixins/overlay_snack_bar.dart`
# adapts from Flutter `SnackBar` in `/material/snack_bar.dart` # adapts from Flutter v3.3.3 `SnackBar` in `/material/snack_bar.dart`
# #
# `EagerScaleGestureRecognizer` in `/widgets/common/behaviour/eager_scale_gesture_recognizer.dart` # `EagerScaleGestureRecognizer` in `/widgets/common/behaviour/eager_scale_gesture_recognizer.dart`
# adapts from Flutter `ScaleGestureRecognizer` in `/gestures/scale.dart` # adapts from Flutter v3.3.3 `ScaleGestureRecognizer` in `/gestures/scale.dart`
# #
# `KnownExtentScrollPhysics` in `/widgets/common/behaviour/known_extent_scroll_physics.dart` # `KnownExtentScrollPhysics` in `/widgets/common/behaviour/known_extent_scroll_physics.dart`
# adapts from Flutter `FixedExtentScrollPhysics` in `/widgets/list_wheel_scroll_view.dart` # adapts from Flutter v3.3.3 `FixedExtentScrollPhysics` in `/widgets/list_wheel_scroll_view.dart`
# #
# `TransitionImage` in `/widgets/common/fx/transition_image.dart` # `TransitionImage` in `/widgets/common/fx/transition_image.dart`
# adapts from Flutter `RawImage` in `/widgets/basic.dart` and `DecorationImagePainter` in `/painting/decoration_image.dart` # adapts from Flutter v3.3.3 `_ImageState` in `/widgets/image.dart`
# and `DecorationImagePainter` in `/painting/decoration_image.dart`
# #
# `_RenderSliverKnownExtentBoxAdaptor` in `/widgets/common/grid/sliver.dart` # `_RenderSliverKnownExtentBoxAdaptor` in `/widgets/common/grid/sliver.dart`
# adapts from Flutter `RenderSliverFixedExtentBoxAdaptor` in `/rendering/sliver_fixed_extent_list.dart` # adapts from Flutter v3.3.3 `RenderSliverFixedExtentBoxAdaptor` in `/rendering/sliver_fixed_extent_list.dart`
# #
# `CollectionSearchDelegate`, `SearchPageRoute` in `/widgets/search/search_delegate.dart` # `CollectionSearchDelegate`, `SearchPageRoute` in `/widgets/search/search_delegate.dart`
# adapts from Flutter `SearchDelegate`, `_SearchPageRoute` in `/material/search.dart` # adapts from Flutter v3.3.3 `SearchDelegate`, `_SearchPageRoute` in `/material/search.dart`

File diff suppressed because one or more lines are too long

1
shaders_3.3.3.sksl.json Normal file

File diff suppressed because one or more lines are too long