|
|
|
import 'dart:io';
|
|
|
|
import 'dart:typed_data';
|
|
|
|
|
|
|
|
import 'package:doublefeel_flutter/app/modules/watch_theme/models/watch_theme_models.dart';
|
|
|
|
import 'package:doublefeel_flutter/pigeon/wear_engine_api.g.dart';
|
|
|
|
import 'package:flutter/foundation.dart';
|
|
|
|
import 'package:flutter/services.dart';
|
|
|
|
|
|
|
|
class WatchThemeSyncPayloadBuilder {
|
|
...
|
...
|
@@ -46,18 +46,37 @@ class WatchThemeSyncPayloadBuilder { |
|
|
|
}
|
|
|
|
|
|
|
|
Future<Uint8List?> _downloadImage(Uri uri) async {
|
|
|
|
final client = HttpClient();
|
|
|
|
try {
|
|
|
|
final request = await client.getUrl(uri);
|
|
|
|
final response = await request.close();
|
|
|
|
if (response.statusCode < 200 || response.statusCode >= 300) {
|
|
|
|
return null;
|
|
|
|
const maxAttempts = 3;
|
|
|
|
for (var attempt = 0; attempt < maxAttempts; attempt += 1) {
|
|
|
|
final client = HttpClient()
|
|
|
|
..connectionTimeout = const Duration(seconds: 15)
|
|
|
|
..idleTimeout = const Duration(seconds: 5);
|
|
|
|
try {
|
|
|
|
final request = await client.getUrl(uri);
|
|
|
|
request.headers.set(HttpHeaders.acceptHeader, 'image/*,*/*');
|
|
|
|
request.headers.set(HttpHeaders.connectionHeader, 'close');
|
|
|
|
request.headers.set(
|
|
|
|
HttpHeaders.userAgentHeader,
|
|
|
|
'doublefeel_flutter/watch_theme',
|
|
|
|
);
|
|
|
|
final response = await request.close();
|
|
|
|
if (response.statusCode < 200 || response.statusCode >= 300) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
final builder = BytesBuilder(copy: false);
|
|
|
|
await for (final chunk in response) {
|
|
|
|
builder.add(chunk);
|
|
|
|
}
|
|
|
|
return builder.takeBytes();
|
|
|
|
} catch (_) {
|
|
|
|
if (attempt == maxAttempts - 1) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
await Future<void>.delayed(Duration(milliseconds: 150 * (attempt + 1)));
|
|
|
|
} finally {
|
|
|
|
client.close(force: true);
|
|
|
|
}
|
|
|
|
return consolidateHttpClientResponseBytes(response);
|
|
|
|
} catch (_) {
|
|
|
|
return null;
|
|
|
|
} finally {
|
|
|
|
client.close(force: true);
|
|
|
|
}
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
} |
...
|
...
|
|