refactor: unify device analysis and performance testing logic for improved module consistency
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user