25-9-1-1
This commit is contained in:
86
lib/controller/home/device_tier.dart
Normal file
86
lib/controller/home/device_tier.dart
Normal file
@@ -0,0 +1,86 @@
|
||||
import 'dart:io';
|
||||
import 'package:device_info_plus/device_info_plus.dart';
|
||||
|
||||
import '../../main.dart';
|
||||
|
||||
// مفاتيح التخزين (بسيطة)
|
||||
const _kDeviceTierKey = 'deviceTier'; // 'low' | 'mid' | 'high'
|
||||
const _kDeviceTierCheckedAtKey = 'deviceTierTime'; // millisSinceEpoch
|
||||
|
||||
Future<String> detectAndCacheDeviceTier({bool force = false}) async {
|
||||
// لا تعيد الفحص إذا عملناه خلال آخر 24 ساعة
|
||||
if (!force) {
|
||||
final last = box.read(_kDeviceTierCheckedAtKey);
|
||||
if (last is int) {
|
||||
final dt = DateTime.fromMillisecondsSinceEpoch(last);
|
||||
if (DateTime.now().difference(dt) < const Duration(hours: 24)) {
|
||||
final cached = box.read(_kDeviceTierKey);
|
||||
if (cached is String && cached.isNotEmpty)
|
||||
return cached; // low/mid/high
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
final info = DeviceInfoPlugin();
|
||||
int score = 0;
|
||||
|
||||
if (Platform.isAndroid) {
|
||||
final a = await info.androidInfo;
|
||||
final int sdk = a.version.sdkInt ?? 0;
|
||||
final int cores = Platform.numberOfProcessors;
|
||||
final int abisCount = a.supportedAbis.length;
|
||||
final bool isEmu = !(a.isPhysicalDevice ?? true);
|
||||
|
||||
// SDK (أقدم = أضعف)
|
||||
if (sdk <= 26)
|
||||
score += 3; // 8.0 وأقدم
|
||||
else if (sdk <= 29)
|
||||
score += 2; // 9-10
|
||||
else if (sdk <= 30) score += 1; // 11
|
||||
|
||||
// الأنوية
|
||||
if (cores <= 4)
|
||||
score += 3;
|
||||
else if (cores <= 6)
|
||||
score += 2;
|
||||
else if (cores <= 8) score += 1;
|
||||
|
||||
// ABI count (القليل غالباً أضعف)
|
||||
if (abisCount <= 1)
|
||||
score += 2;
|
||||
else if (abisCount == 2) score += 1;
|
||||
|
||||
// محاكي
|
||||
if (isEmu) score += 2;
|
||||
} else {
|
||||
// iOS/منصات أخرى: تقدير سريع بالأنوية فقط
|
||||
final int cores = Platform.numberOfProcessors;
|
||||
if (cores <= 4)
|
||||
score += 3;
|
||||
else if (cores <= 6)
|
||||
score += 2;
|
||||
else if (cores <= 8) score += 1;
|
||||
}
|
||||
|
||||
// تحويل السكور إلى تصنيف
|
||||
final String tier = (score >= 6)
|
||||
? 'low'
|
||||
: (score >= 3)
|
||||
? 'mid'
|
||||
: 'high';
|
||||
|
||||
box.write(_kDeviceTierKey, tier);
|
||||
box.write(_kDeviceTierCheckedAtKey, DateTime.now().millisecondsSinceEpoch);
|
||||
return tier;
|
||||
}
|
||||
|
||||
// للقراءة السريعة وقت ما تحتاج:
|
||||
String getCachedDeviceTier() {
|
||||
final t = box.read(_kDeviceTierKey);
|
||||
if (t is String && t.isNotEmpty) return t;
|
||||
return 'mid';
|
||||
}
|
||||
|
||||
bool isLowEnd() => getCachedDeviceTier() == 'low';
|
||||
bool isMidEnd() => getCachedDeviceTier() == 'mid';
|
||||
bool isHighEnd() => getCachedDeviceTier() == 'high';
|
||||
Reference in New Issue
Block a user