fix(mobile/telemetry): add NativeAdapter to heartbeat & uploader, fix 2xx status check

- HeartbeatService: add NativeAdapter on Android to fix DNS via Java stack;
  fix status check from == 200 to >= 200 && < 300
- TelemetryUploader: same two fixes (refactor to _buildDio static method)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
hailin 2026-03-07 11:29:36 -08:00
parent 9e368cbf37
commit 13ab4ba1f3
2 changed files with 27 additions and 9 deletions

View File

@ -1,6 +1,8 @@
import 'dart:async'; import 'dart:async';
import 'dart:io';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:dio/dio.dart'; import 'package:dio/dio.dart';
import 'package:native_dio_adapter/native_dio_adapter.dart';
import '../session/session_manager.dart'; import '../session/session_manager.dart';
import '../session/session_events.dart'; import '../session/session_events.dart';
import 'presence_config.dart'; import 'presence_config.dart';
@ -81,6 +83,9 @@ class HeartbeatService {
connectTimeout: const Duration(seconds: 5), connectTimeout: const Duration(seconds: 5),
receiveTimeout: const Duration(seconds: 5), receiveTimeout: const Duration(seconds: 5),
)); ));
if (Platform.isAndroid) {
_dio.httpClientAdapter = NativeAdapter();
}
// //
final sessionManager = SessionManager(); final sessionManager = SessionManager();
@ -184,7 +189,8 @@ class HeartbeatService {
), ),
); );
if (response.statusCode == 200) { final code = response.statusCode ?? 0;
if (code >= 200 && code < 300) {
_lastHeartbeatAt = DateTime.now(); _lastHeartbeatAt = DateTime.now();
_heartbeatCount++; _heartbeatCount++;
debugPrint('💓 [Heartbeat] Sent #$_heartbeatCount'); debugPrint('💓 [Heartbeat] Sent #$_heartbeatCount');

View File

@ -1,6 +1,8 @@
import 'dart:async'; import 'dart:async';
import 'dart:io';
import 'package:dio/dio.dart'; import 'package:dio/dio.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:native_dio_adapter/native_dio_adapter.dart';
import '../storage/telemetry_storage.dart'; import '../storage/telemetry_storage.dart';
/// ///
@ -20,11 +22,20 @@ class TelemetryUploader {
required this.apiBaseUrl, required this.apiBaseUrl,
required this.storage, required this.storage,
this.getAuthHeaders, this.getAuthHeaders,
}) : _dio = Dio(BaseOptions( }) : _dio = _buildDio(apiBaseUrl);
baseUrl: apiBaseUrl,
connectTimeout: const Duration(seconds: 10), static Dio _buildDio(String baseUrl) {
receiveTimeout: const Duration(seconds: 10), final dio = Dio(BaseOptions(
)); baseUrl: baseUrl,
connectTimeout: const Duration(seconds: 10),
receiveTimeout: const Duration(seconds: 10),
));
// ApiClient Android OkHttp Dart native socket DNS
if (Platform.isAndroid) {
dio.httpClientAdapter = NativeAdapter();
}
return dio;
}
/// (3020) /// (3020)
void startPeriodicUpload({ void startPeriodicUpload({
@ -75,13 +86,14 @@ class TelemetryUploader {
), ),
); );
if (response.statusCode == 200) { final code = response.statusCode ?? 0;
// , if (code >= 200 && code < 300) {
// POST 201 Created
await storage.removeEvents(events.length); await storage.removeEvents(events.length);
debugPrint('✅ Uploaded ${events.length} telemetry events'); debugPrint('✅ Uploaded ${events.length} telemetry events');
return true; return true;
} else { } else {
debugPrint('❌ Upload failed: ${response.statusCode}'); debugPrint('❌ Upload failed: $code');
return false; return false;
} }
} on DioException catch (e) { } on DioException catch (e) {