refactor: unify device analysis and performance testing logic for improved module consistency

This commit is contained in:
Hamza-Ayed
2026-07-09 15:09:02 +03:00
parent d94808c380
commit 5e6aeb7908
2 changed files with 99 additions and 53 deletions
@@ -8,6 +8,12 @@ import 'performance_test.dart'; // Make sure this path is correct
class DeviceAnalyzer {
final DeviceInfoPlugin _deviceInfo = DeviceInfoPlugin();
// نتيجة الفحص لا تتغير عمليا خلال جلسة واحدة، فنخزنها مؤقتا
// كي لا تُعاد الاختبارات الثقيلة (كتابة تخزين + حساب مكثف) كل مرة تُفتح الصفحة.
static List<Map<String, dynamic>>? _cachedResult;
static DateTime? _cachedAt;
static const Duration _cacheTtl = Duration(minutes: 30);
/// Reads the total RAM from the system's meminfo file.
/// Returns the value in Megabytes (MB).
Future<double> _readTotalRamMB() async {
@@ -53,9 +59,12 @@ class DeviceAnalyzer {
}
/// The main analysis function that runs all checks.
Future<Map<String, dynamic>> analyzeDevice() async {
List<Map<String, dynamic>> details = [];
///
/// البنود من 1 إلى 7 تقيس قدرة الجهاز الثابتة (لا تتغير خلال الجلسة) وتُخزَّن
/// مؤقتا لتفادي إعادة تشغيل الاختبارات الثقيلة (كتابة تخزين + حساب مكثف) في كل
/// مرة تُفتح فيها الصفحة. أما بند ضغط الذاكرة الحالي (#8) فيُقاس دائما بشكل فوري
/// لأنه رقم متغير باستمرار ولا يصح تجميده مع بقية النتيجة.
Future<Map<String, dynamic>> analyzeDevice({bool forceRefresh = false}) async {
if (!Platform.isAndroid) {
return {
'score': 0,
@@ -70,6 +79,50 @@ class DeviceAnalyzer {
};
}
List<Map<String, dynamic>> staticDetails;
if (!forceRefresh &&
_cachedResult != null &&
_cachedAt != null &&
DateTime.now().difference(_cachedAt!) < _cacheTtl) {
staticDetails = _cachedResult!;
} else {
staticDetails = await _computeStaticDetails();
_cachedResult = staticDetails;
_cachedAt = DateTime.now();
}
// 8. Memory Pressure (Max: 15 points) — يُقاس دائما بشكل فوري، لا يُخزَّن مؤقتا.
final usedPercent = await _readUsedRamPercent();
int memScore;
if (usedPercent <= 60) {
memScore = 15;
} else if (usedPercent <= 80) {
memScore = 10;
} else if (usedPercent <= 90) {
memScore = 5;
} else {
memScore = 0;
}
final memDetail = {
'label': 'استخدام الرام الحالي (${usedPercent.toStringAsFixed(0)}%)',
'status': memScore >= 10,
'achieved_score': memScore,
'max_score': 15,
};
final details = [...staticDetails, memDetail];
final totalScore = details.fold<int>(
0, (sum, item) => sum + (item['achieved_score'] as int));
return {
'score': totalScore.clamp(0, 100),
'details': details,
};
}
Future<List<Map<String, dynamic>>> _computeStaticDetails() async {
List<Map<String, dynamic>> details = [];
final info = await _deviceInfo.androidInfo;
final data = info.data;
final features = List<String>.from(data['systemFeatures'] ?? []);
@@ -174,32 +227,6 @@ class DeviceAnalyzer {
'max_score': 20,
});
// 8. Memory Pressure (Max: 15 points)
final usedPercent = await _readUsedRamPercent();
int memScore;
if (usedPercent <= 60) {
memScore = 15;
} else if (usedPercent <= 80) {
memScore = 10;
} else if (usedPercent <= 90) {
memScore = 5;
} else {
memScore = 0;
}
details.add({
'label': 'استخدام الرام الحالي (${usedPercent.toStringAsFixed(0)}%)',
'status': memScore >= 10,
'achieved_score': memScore,
'max_score': 15,
});
// Calculate the final total score by summing up the achieved scores.
final totalScore = details.fold<int>(
0, (sum, item) => sum + (item['achieved_score'] as int));
return {
'score': totalScore.clamp(0, 100),
'details': details,
};
return details;
}
}