mirror of
https://github.com/block/buzz.git
synced 2026-11-03 07:51:22 +00:00
## Summary - add inline profile photo capture with smooth avatar-to-viewfinder transitions - add close, flip, shutter, retry, and use-photo states with haptics and front-camera mirroring - polish iOS liquid-glass controls and avatar editor motion ### Related issue Follow-up to #6583. ### Testing - just mobile-check - just mobile-test (1,743 tests) - built, installed, and launched on Pixel 10 and iPhone Air --------- Signed-off-by: kenny lopez <klopez4212@gmail.com> Signed-off-by: Code Reviewer <037593536284cf40e221c96c931e9877d4166d54f6bb84e5341a86d7fd5d05a4@buzz.block.builderlab.xyz> Signed-off-by: Perci <5a968df9a7494b4e019b9ecf739e088ba61097b4312124e9a88ae5b42e3f5f3e@buzz.block.builderlab.xyz> Signed-off-by: Max <d8473ee32b973aa31a21a65adddcc4b69cc2a8a4dee8121ecd51926e0cddbc02@buzz.block.builderlab.xyz> Signed-off-by: Wren <5217c5c2f7bfb4333e46d17c98a9255a52dadee18dcd43a43536b95e6776dfa0@buzz.block.builderlab.xyz> Signed-off-by: Meli <5aaa86bce934fc3445fc254aab560a40923f10252f92107e665073dede0e04d3@buzz.block.builderlab.xyz> Signed-off-by: morgmart <98432065+morgmart@users.noreply.github.com> Co-authored-by: Code Reviewer <037593536284cf40e221c96c931e9877d4166d54f6bb84e5341a86d7fd5d05a4@buzz.block.builderlab.xyz> Co-authored-by: Tyler <109685178+tlongwell-block@users.noreply.github.com> Co-authored-by: Perci <5a968df9a7494b4e019b9ecf739e088ba61097b4312124e9a88ae5b42e3f5f3e@buzz.block.builderlab.xyz> Co-authored-by: Max <d8473ee32b973aa31a21a65adddcc4b69cc2a8a4dee8121ecd51926e0cddbc02@buzz.block.builderlab.xyz> Co-authored-by: Wren <5217c5c2f7bfb4333e46d17c98a9255a52dadee18dcd43a43536b95e6776dfa0@buzz.block.builderlab.xyz> Co-authored-by: Meli <5aaa86bce934fc3445fc254aab560a40923f10252f92107e665073dede0e04d3@buzz.block.builderlab.xyz> Co-authored-by: morgmart <98432065+morgmart@users.noreply.github.com> Co-authored-by: Claude <noreply@anthropic.com>
59 lines
1.6 KiB
Dart
59 lines
1.6 KiB
Dart
import 'dart:async';
|
|
|
|
import 'package:buzz/features/profile/camera_disposal_barrier.dart';
|
|
import 'package:flutter_test/flutter_test.dart';
|
|
|
|
void main() {
|
|
test('failed disposal settles before a replacement camera release', () async {
|
|
final barrier = CameraDisposalBarrier();
|
|
final firstDispose = Completer<void>();
|
|
final secondDispose = Completer<void>();
|
|
var secondStarted = false;
|
|
|
|
final first = barrier.release(() => firstDispose.future);
|
|
final second = barrier.release(() {
|
|
secondStarted = true;
|
|
return secondDispose.future;
|
|
});
|
|
|
|
expect(secondStarted, isFalse);
|
|
firstDispose.completeError(StateError('native camera teardown failed'));
|
|
await first;
|
|
await Future<void>.delayed(Duration.zero);
|
|
expect(secondStarted, isTrue);
|
|
|
|
secondDispose.complete();
|
|
await second;
|
|
await barrier.settled;
|
|
});
|
|
|
|
test(
|
|
'serializes replacement releases without overlapping ownership',
|
|
() async {
|
|
final barrier = CameraDisposalBarrier();
|
|
final firstDispose = Completer<void>();
|
|
var activeDisposals = 0;
|
|
var overlapped = false;
|
|
|
|
final first = barrier.release(() async {
|
|
activeDisposals++;
|
|
if (activeDisposals > 1) overlapped = true;
|
|
await firstDispose.future;
|
|
activeDisposals--;
|
|
});
|
|
final second = barrier.release(() async {
|
|
activeDisposals++;
|
|
if (activeDisposals > 1) overlapped = true;
|
|
activeDisposals--;
|
|
});
|
|
|
|
await Future<void>.delayed(Duration.zero);
|
|
expect(activeDisposals, 1);
|
|
firstDispose.complete();
|
|
await Future.wait([first, second]);
|
|
|
|
expect(overlapped, isFalse);
|
|
},
|
|
);
|
|
}
|