-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathpairing_screen.dart
126 lines (113 loc) · 3.86 KB
/
pairing_screen.dart
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
import 'dart:async';
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:pairsonic/features/profile/identity_service.dart';
import 'package:pairsonic/features/profile/user_model.dart';
import 'package:pairsonic/generated/l10n.dart';
import 'package:pairsonic/constants.dart';
import 'package:pairsonic/helper/gui_utility_interface.dart';
import 'package:pairsonic/service_locator.dart';
import 'audio/ui/grouppairing_audio_widget.dart';
import 'pairing_arguments.dart';
import 'pairing_success_screen.dart';
/// The Paring Screen to exchange / verify user profiles.
/// The screen can use different implementations of [Widget] similar to [pairingWidget] based on the settings in [SettingsService] which can be set in [SettingsScreen].
/// Currently only [QrPairingWidget] is used.
/// {@category Screens}
class PairingScreen extends StatefulWidget {
final PairingArguments? pairingArgs;
const PairingScreen({super.key, this.pairingArgs});
@override
State<PairingScreen> createState() => _PairingScreenState();
}
class _PairingScreenState extends State<PairingScreen> {
var identityService = getIt<IdentityService>();
var storageService = getIt<GuiUtilityInterface>();
late PairingMethod _method;
late PairingArguments? _args;
StreamController<double> _pairingProgressStream = StreamController();
@override
void initState() {
super.initState();
_args = widget.pairingArgs;
_method =
_args != null ? _args!.method : PairingMethodHelper.fromSettings();
_pairingProgressStream.sink.add(0.05);
}
_PairingScreenState();
Future<bool> receivedPairingData(String? pairingData,
{PairingArguments? pairingArguments}) async {
PairingData? receivedPairingData;
try {
if (pairingData != null) {
debugPrint("Received Pairing data:$pairingData");
var decoded = jsonDecode(pairingData);
receivedPairingData = PairingData.fromJson(decoded!);
}
} catch (e) {
debugPrint("Pairing import failed: $e");
}
if (receivedPairingData == null) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text(S.of(context).pairingImportFailed)));
return false;
}
storageService.addOrVerifyUser(receivedPairingData);
// ScaffoldMessenger.of(context).showSnackBar(
// SnackBar(
// content: Text(
// S.of(context).verifiedName(receivedPairingData.name),
// ),
// ),
// );
if (pairingArguments == null) {
Navigator.pop(context);
}
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => PairingSuccessScreen(
receivedPairingData!.deviceId,
pairingArguments: pairingArguments,
),
),
);
return true;
}
@override
Widget build(BuildContext context) {
Widget pairingWidget = getPairingWidget();
return StreamBuilder<double>(
stream: _pairingProgressStream.stream,
builder: (context, snapshot) {
if (!snapshot.hasData) {
return const Center(child: CircularProgressIndicator());
}
final progress = snapshot.data!;
return Scaffold(
body: pairingWidget,
appBar: AppBar(
title: Text('${_method.readableName(context)}'),
bottom: progress > 0.0 ? PreferredSize(
preferredSize: Size.fromHeight(6.0),
child: LinearProgressIndicator(
value: progress,
),
) : PreferredSize(preferredSize: Size.zero, child: SizedBox.shrink()),
),
);
}
);
}
Widget getPairingWidget() {
Widget pairingWidget;
switch (_method) {
case PairingMethod.groupAudio:
pairingWidget = GroupPairingAudioWidget(_pairingProgressStream.sink);
break;
default:
throw Exception("PairingScreen_Default_Hit");
}
return pairingWidget;
}
}