Skip to content

Commit 2064bb6

Browse files
rajveermalviyagnprice
authored andcommitted
binding: Prefetch deviceInfo during initialization
This is a preparatory commit for the work of embedding the device info in user-agent header.
1 parent 5148c45 commit 2064bb6

File tree

4 files changed

+42
-16
lines changed

4 files changed

+42
-16
lines changed

lib/main.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ void main() {
1313
return true;
1414
}());
1515
LicenseRegistry.addLicense(additionalLicenses);
16-
LiveZulipBinding.ensureInitialized();
1716
WidgetsFlutterBinding.ensureInitialized();
17+
LiveZulipBinding.ensureInitialized();
1818
NotificationService.instance.start();
1919
runApp(const ZulipApp());
2020
}

lib/model/binding.dart

Lines changed: 35 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import 'package:flutter_local_notifications/flutter_local_notifications.dart';
66
import 'package:url_launcher/url_launcher.dart' as url_launcher;
77

88
import '../host/android_notifications.dart';
9+
import '../log.dart';
910
import '../widgets/store.dart';
1011
import 'store.dart';
1112

@@ -101,8 +102,18 @@ abstract class ZulipBinding {
101102
/// Provides device and operating system information,
102103
/// via package:device_info_plus.
103104
///
105+
/// The returned Future resolves to null if an error is
106+
/// encountered while fetching the data.
107+
///
104108
/// This wraps [device_info_plus.DeviceInfoPlugin.deviceInfo].
105-
Future<BaseDeviceInfo> deviceInfo();
109+
Future<BaseDeviceInfo?> get deviceInfo;
110+
111+
/// Provides device and operating system information,
112+
/// via package:device_info_plus.
113+
///
114+
/// This is the value [deviceInfo] resolved to,
115+
/// or null if that hasn't resolved yet.
116+
BaseDeviceInfo? get syncDeviceInfo;
106117

107118
/// Initialize Firebase, to use for notifications.
108119
///
@@ -161,6 +172,10 @@ class IosDeviceInfo extends BaseDeviceInfo {
161172
/// Methods wrapping a plugin, like [launchUrl], invoke the actual
162173
/// underlying plugin method.
163174
class LiveZulipBinding extends ZulipBinding {
175+
LiveZulipBinding() {
176+
_deviceInfo = _prefetchDeviceInfo();
177+
}
178+
164179
/// Initialize the binding if necessary, and ensure it is a [LiveZulipBinding].
165180
static LiveZulipBinding ensureInitialized() {
166181
if (ZulipBinding._instance == null) {
@@ -196,13 +211,25 @@ class LiveZulipBinding extends ZulipBinding {
196211
}
197212

198213
@override
199-
Future<BaseDeviceInfo> deviceInfo() async {
200-
final deviceInfo = await device_info_plus.DeviceInfoPlugin().deviceInfo;
201-
return switch (deviceInfo) {
202-
device_info_plus.AndroidDeviceInfo(:var version) => AndroidDeviceInfo(sdkInt: version.sdkInt),
203-
device_info_plus.IosDeviceInfo(:var systemVersion) => IosDeviceInfo(systemVersion: systemVersion),
204-
_ => throw UnimplementedError(),
205-
};
214+
Future<BaseDeviceInfo?> get deviceInfo => _deviceInfo;
215+
late Future<BaseDeviceInfo?> _deviceInfo;
216+
217+
@override
218+
BaseDeviceInfo? get syncDeviceInfo => _syncDeviceInfo;
219+
BaseDeviceInfo? _syncDeviceInfo;
220+
221+
Future<BaseDeviceInfo?> _prefetchDeviceInfo() async {
222+
try {
223+
final info = await device_info_plus.DeviceInfoPlugin().deviceInfo;
224+
_syncDeviceInfo = switch (info) {
225+
device_info_plus.AndroidDeviceInfo(:var version) => AndroidDeviceInfo(sdkInt: version.sdkInt),
226+
device_info_plus.IosDeviceInfo(:var systemVersion) => IosDeviceInfo(systemVersion: systemVersion),
227+
_ => throw UnimplementedError(),
228+
};
229+
} catch (e, st) {
230+
assert(debugLog('Failed to prefetch device info: $e\n$st')); // TODO(log)
231+
}
232+
return _syncDeviceInfo;
206233
}
207234

208235
@override

lib/widgets/clipboard.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ void copyWithPopup({
1818
required Widget successContent,
1919
}) async {
2020
await Clipboard.setData(data);
21-
final deviceInfo = await ZulipBinding.instance.deviceInfo();
21+
final deviceInfo = await ZulipBinding.instance.deviceInfo;
2222

2323
if (!context.mounted) return;
2424

test/model/binding.dart

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -204,9 +204,7 @@ class TestZulipBinding extends ZulipBinding {
204204
_closeInAppWebViewCallCount++;
205205
}
206206

207-
/// The value that `ZulipBinding.instance.deviceInfo()` should return.
208-
///
209-
/// See also [takeDeviceInfoCalls].
207+
/// The value that `ZulipBinding.instance.deviceInfo` should return.
210208
BaseDeviceInfo deviceInfoResult = _defaultDeviceInfoResult;
211209
static final _defaultDeviceInfoResult = AndroidDeviceInfo(sdkInt: 33);
212210

@@ -215,9 +213,10 @@ class TestZulipBinding extends ZulipBinding {
215213
}
216214

217215
@override
218-
Future<BaseDeviceInfo> deviceInfo() {
219-
return Future(() => deviceInfoResult);
220-
}
216+
Future<BaseDeviceInfo?> get deviceInfo async => deviceInfoResult;
217+
218+
@override
219+
BaseDeviceInfo? get syncDeviceInfo => deviceInfoResult;
221220

222221
void _resetFirebase() {
223222
_firebaseInitialized = false;

0 commit comments

Comments
 (0)