diff --git a/app/src/main/java/com/sameerasw/essentials/ui/activities/YourAndroidActivity.kt b/app/src/main/java/com/sameerasw/essentials/ui/activities/YourAndroidActivity.kt index 443f1e1b9..261eba91e 100644 --- a/app/src/main/java/com/sameerasw/essentials/ui/activities/YourAndroidActivity.kt +++ b/app/src/main/java/com/sameerasw/essentials/ui/activities/YourAndroidActivity.kt @@ -92,81 +92,92 @@ class YourAndroidViewModel : ViewModel() { } viewModelScope.launch { - if (forceRefresh) { - _isRefreshing.value = true - } else { - _isSpecsLoading.value = true - - // Try to load from cache first - val cached = withContext(Dispatchers.IO) { - com.sameerasw.essentials.utils.DeviceSpecsCache.getCachedSpecs(context) - } - - if (cached != null) { - _deviceSpecs.value = cached - _isSpecsLoading.value = false - return@launch + try { + if (forceRefresh) { + _isRefreshing.value = true + } else { + _isSpecsLoading.value = true + + // Try to load from cache first + val cached = withContext(Dispatchers.IO) { + com.sameerasw.essentials.utils.DeviceSpecsCache.getCachedSpecs(context) + } + + if (cached != null) { + _deviceSpecs.value = cached + _isSpecsLoading.value = false + return@launch + } } - } - val fetchedSpecs = withContext(Dispatchers.IO) { - val manufacturer = deviceInfo.manufacturer - val model = deviceInfo.model - val deviceName = deviceInfo.deviceName - val deviceCodename = deviceInfo.device + val fetchedSpecs = withContext(Dispatchers.IO) { + val manufacturer = deviceInfo.manufacturer + val model = deviceInfo.model + val deviceName = deviceInfo.deviceName + val deviceCodename = deviceInfo.device - // Generate a prioritized list of search queries - val queries = mutableListOf() - - // 1. Marketing name (Manufacturer + Model) - if (model.contains(manufacturer, ignoreCase = true)) { - queries.add(model) - } else { - queries.add("$manufacturer $model") - } + // Generate a prioritized list of search queries + val queries = mutableListOf() + + // 1. Marketing name (Manufacturer + Model) + if (model.contains(manufacturer, ignoreCase = true)) { + queries.add(model) + } else { + queries.add("$manufacturer $model") + } - // 2. User-defined device name (often it's the marketing name like "Galaxy S21 FE 5G") - if (deviceName.isNotBlank() && !queries.contains(deviceName)) { - queries.add(deviceName) - } + // 2. User-defined device name (often it's the marketing name like "Galaxy S21 FE 5G") + if (deviceName.isNotBlank() && !queries.contains(deviceName)) { + queries.add(deviceName) + } - // 3. Handle model numbers by stripping common prefixes (SM-, Redmi, Mi, POCO, etc.) - val prefixes = listOf("SM-", "Redmi ", "Mi ", "POCO ") - for (prefix in prefixes) { - if (model.startsWith(prefix, ignoreCase = true)) { - val stripped = model.substring(prefix.length).trim() - if (stripped.isNotBlank() && !queries.contains(stripped)) { - queries.add(stripped) - queries.add("$manufacturer $stripped") + // 3. Handle model numbers by stripping common prefixes (SM-, Redmi, Mi, POCO, etc.) + val prefixes = listOf("SM-", "Redmi ", "Mi ", "POCO ") + for (prefix in prefixes) { + if (model.startsWith(prefix, ignoreCase = true)) { + val stripped = model.substring(prefix.length).trim() + if (stripped.isNotBlank() && !queries.contains(stripped)) { + queries.add(stripped) + queries.add("$manufacturer $stripped") + } } } + + // 4. Model number directly if it's different from marketing name + if (!queries.contains(model)) { + queries.add(model) + } + + // 5. Device codename (e.g., "shiba", "a51", "r9q") + if (deviceCodename.isNotBlank() && !queries.contains(deviceCodename)) { + queries.add(deviceCodename) + } + + com.sameerasw.essentials.utils.GSMArenaService.fetchSpecs( + preferredName = manufacturer, + preferredModel = model, + queries = queries.toTypedArray() + ) } - - // 4. Model number directly if it's different from marketing name - if (!queries.contains(model)) { - queries.add(model) + + if (fetchedSpecs != null) { + // Download and cache images + val specsWithImages = com.sameerasw.essentials.utils.DeviceSpecsCache.downloadImages(context, fetchedSpecs) + _deviceSpecs.value = specsWithImages } - // 5. Device codename (e.g., "shiba", "a51", "r9q") - if (deviceCodename.isNotBlank() && !queries.contains(deviceCodename)) { - queries.add(deviceCodename) + _isSpecsLoading.value = false + _isRefreshing.value = false + } catch (e: Exception) { + // If anything goes wrong (corrupted cache, etc.), clear cache and force refresh once + com.sameerasw.essentials.utils.DeviceSpecsCache.clearCache(context) + if (!forceRefresh) { + loadDeviceSpecs(context, deviceInfo, forceRefresh = true) + } else { + _isSpecsLoading.value = false + _isRefreshing.value = false } - - com.sameerasw.essentials.utils.GSMArenaService.fetchSpecs( - preferredName = manufacturer, - preferredModel = model, - queries = queries.toTypedArray() - ) - } - - if (fetchedSpecs != null) { - // Download and cache images - val specsWithImages = com.sameerasw.essentials.utils.DeviceSpecsCache.downloadImages(context, fetchedSpecs) - _deviceSpecs.value = specsWithImages } - - _isSpecsLoading.value = false - _isRefreshing.value = false } } } diff --git a/app/src/main/java/com/sameerasw/essentials/utils/DeviceSpecsCache.kt b/app/src/main/java/com/sameerasw/essentials/utils/DeviceSpecsCache.kt index 0df4c1e87..335586c58 100644 --- a/app/src/main/java/com/sameerasw/essentials/utils/DeviceSpecsCache.kt +++ b/app/src/main/java/com/sameerasw/essentials/utils/DeviceSpecsCache.kt @@ -25,8 +25,18 @@ object DeviceSpecsCache { val file = File(context.filesDir, SPECS_FILE) if (!file.exists()) return null val json = file.readText() - gson.fromJson(json, DeviceSpecs::class.java) + val specs = gson.fromJson(json, DeviceSpecs::class.java) + + // Validate essential data integrity or refetch + @Suppress("SENSELESS_COMPARISON") + if (specs == null || specs.detailSpec == null) { + clearCache(context) + null + } else { + specs + } } catch (e: Exception) { + clearCache(context) null } }