From 2584d07f5526a4550b45d9b1e722b6a35067c819 Mon Sep 17 00:00:00 2001 From: rainxchzed Date: Thu, 7 May 2026 10:54:07 +0500 Subject: [PATCH 1/5] feat(apps): add per-app updateCheckEnabled setter and gate update check --- .../core/data/local/db/dao/InstalledAppDao.kt | 3 +++ .../repository/InstalledAppsRepositoryImpl.kt | 24 +++++++++++++++++++ .../repository/InstalledAppsRepository.kt | 5 ++++ 3 files changed, 32 insertions(+) diff --git a/core/data/src/commonMain/kotlin/zed/rainxch/core/data/local/db/dao/InstalledAppDao.kt b/core/data/src/commonMain/kotlin/zed/rainxch/core/data/local/db/dao/InstalledAppDao.kt index cf9c121a0..5fc8f3abb 100644 --- a/core/data/src/commonMain/kotlin/zed/rainxch/core/data/local/db/dao/InstalledAppDao.kt +++ b/core/data/src/commonMain/kotlin/zed/rainxch/core/data/local/db/dao/InstalledAppDao.kt @@ -80,6 +80,9 @@ interface InstalledAppDao { @Query("UPDATE installed_apps SET includePreReleases = :enabled WHERE packageName = :packageName") suspend fun updateIncludePreReleases(packageName: String, enabled: Boolean) + @Query("UPDATE installed_apps SET updateCheckEnabled = :enabled WHERE packageName = :packageName") + suspend fun updateUpdateCheckEnabled(packageName: String, enabled: Boolean) + @Query( """ UPDATE installed_apps diff --git a/core/data/src/commonMain/kotlin/zed/rainxch/core/data/repository/InstalledAppsRepositoryImpl.kt b/core/data/src/commonMain/kotlin/zed/rainxch/core/data/repository/InstalledAppsRepositoryImpl.kt index dafac5f57..6a4dde31f 100644 --- a/core/data/src/commonMain/kotlin/zed/rainxch/core/data/repository/InstalledAppsRepositoryImpl.kt +++ b/core/data/src/commonMain/kotlin/zed/rainxch/core/data/repository/InstalledAppsRepositoryImpl.kt @@ -317,6 +317,10 @@ class InstalledAppsRepositoryImpl( override suspend fun checkForUpdates(packageName: String): Boolean { val app = installedAppsDao.getAppByPackage(packageName) ?: return false + if (!app.updateCheckEnabled) { + return false + } + try { val releases = fetchReleaseWindow( @@ -567,6 +571,26 @@ class InstalledAppsRepositoryImpl( installedAppsDao.updateIncludePreReleases(packageName, enabled) } + override suspend fun setUpdateCheckEnabled( + packageName: String, + enabled: Boolean, + ) { + installedAppsDao.updateUpdateCheckEnabled(packageName, enabled) + if (enabled) { + try { + checkForUpdates(packageName) + } catch (e: CancellationException) { + throw e + } catch (e: Exception) { + Logger.w { + "Failed to re-check after enabling update check for $packageName: ${e.message}" + } + } + } else { + installedAppsDao.clearUpdateMetadata(packageName, System.currentTimeMillis()) + } + } + override suspend fun setAssetFilter( packageName: String, regex: String?, diff --git a/core/domain/src/commonMain/kotlin/zed/rainxch/core/domain/repository/InstalledAppsRepository.kt b/core/domain/src/commonMain/kotlin/zed/rainxch/core/domain/repository/InstalledAppsRepository.kt index afd8b277c..6af4f76b8 100644 --- a/core/domain/src/commonMain/kotlin/zed/rainxch/core/domain/repository/InstalledAppsRepository.kt +++ b/core/domain/src/commonMain/kotlin/zed/rainxch/core/domain/repository/InstalledAppsRepository.kt @@ -73,6 +73,11 @@ interface InstalledAppsRepository { enabled: Boolean, ) + suspend fun setUpdateCheckEnabled( + packageName: String, + enabled: Boolean, + ) + /** * Persists per-app monorepo settings: an optional regex applied to asset * names and whether the update checker should fall back to older From 6ab89fe29ff1ce577610df023952aad5eeb7b9e6 Mon Sep 17 00:00:00 2001 From: rainxchzed Date: Thu, 7 May 2026 10:54:11 +0500 Subject: [PATCH 2/5] chore(strings): apps_ignore_updates and updates-ignored status across 13 locales --- .../src/commonMain/composeResources/values-ar/strings-ar.xml | 2 ++ .../src/commonMain/composeResources/values-bn/strings-bn.xml | 2 ++ .../src/commonMain/composeResources/values-es/strings-es.xml | 2 ++ .../src/commonMain/composeResources/values-fr/strings-fr.xml | 2 ++ .../src/commonMain/composeResources/values-hi/strings-hi.xml | 2 ++ .../src/commonMain/composeResources/values-it/strings-it.xml | 2 ++ .../src/commonMain/composeResources/values-ja/strings-ja.xml | 2 ++ .../src/commonMain/composeResources/values-ko/strings-ko.xml | 2 ++ .../src/commonMain/composeResources/values-pl/strings-pl.xml | 2 ++ .../src/commonMain/composeResources/values-ru/strings-ru.xml | 2 ++ .../src/commonMain/composeResources/values-tr/strings-tr.xml | 2 ++ .../composeResources/values-zh-rCN/strings-zh-rCN.xml | 2 ++ .../src/commonMain/composeResources/values/strings.xml | 2 ++ 13 files changed, 26 insertions(+) diff --git a/core/presentation/src/commonMain/composeResources/values-ar/strings-ar.xml b/core/presentation/src/commonMain/composeResources/values-ar/strings-ar.xml index 995c0da46..43414994e 100644 --- a/core/presentation/src/commonMain/composeResources/values-ar/strings-ar.xml +++ b/core/presentation/src/commonMain/composeResources/values-ar/strings-ar.xml @@ -1020,8 +1020,10 @@ في انتظار التثبيت إصدار مسبق مفعّل جاهز للتثبيت + تم تجاهل التحديثات المتغيّر مثبَّت المتغيّر قديم، يلزم اتخاذ إجراء + تجاهل التحديثات طي القسم · %1$d توسيع القسم diff --git a/core/presentation/src/commonMain/composeResources/values-bn/strings-bn.xml b/core/presentation/src/commonMain/composeResources/values-bn/strings-bn.xml index 122675f0a..d3191cf7f 100644 --- a/core/presentation/src/commonMain/composeResources/values-bn/strings-bn.xml +++ b/core/presentation/src/commonMain/composeResources/values-bn/strings-bn.xml @@ -996,8 +996,10 @@ ইনস্টল মুলতুবি প্রি-রিলিজ চালু ইনস্টলের জন্য প্রস্তুত + আপডেট উপেক্ষা করা হয়েছে ভ্যারিয়েন্ট পিন করা ভ্যারিয়েন্ট পুরোনো, ব্যবস্থা প্রয়োজন + আপডেট উপেক্ষা করুন বিভাগ সংকুচিত করুন · %1$d বিভাগ প্রসারিত করুন diff --git a/core/presentation/src/commonMain/composeResources/values-es/strings-es.xml b/core/presentation/src/commonMain/composeResources/values-es/strings-es.xml index 9336150aa..51c4e6dd5 100644 --- a/core/presentation/src/commonMain/composeResources/values-es/strings-es.xml +++ b/core/presentation/src/commonMain/composeResources/values-es/strings-es.xml @@ -968,8 +968,10 @@ instalación pendiente prelanzamiento activado listo para instalar + actualizaciones ignoradas variante fijada variante desfasada, requiere acción + Ignorar actualizaciones Contraer sección · %1$d Expandir sección diff --git a/core/presentation/src/commonMain/composeResources/values-fr/strings-fr.xml b/core/presentation/src/commonMain/composeResources/values-fr/strings-fr.xml index 628d68296..351454034 100644 --- a/core/presentation/src/commonMain/composeResources/values-fr/strings-fr.xml +++ b/core/presentation/src/commonMain/composeResources/values-fr/strings-fr.xml @@ -969,8 +969,10 @@ installation en attente pré-version activée prêt à installer + mises à jour ignorées variante épinglée variante obsolète, action requise + Ignorer les mises à jour Réduire la section · %1$d Développer la section diff --git a/core/presentation/src/commonMain/composeResources/values-hi/strings-hi.xml b/core/presentation/src/commonMain/composeResources/values-hi/strings-hi.xml index cb632c69e..b56f8a3b4 100644 --- a/core/presentation/src/commonMain/composeResources/values-hi/strings-hi.xml +++ b/core/presentation/src/commonMain/composeResources/values-hi/strings-hi.xml @@ -1007,8 +1007,10 @@ इंस्टॉल लंबित प्री-रिलीज़ चालू इंस्टॉल के लिए तैयार + अपडेट अनदेखा किए गए वैरिएंट पिन किया गया वैरिएंट पुराना, कार्रवाई आवश्यक + अपडेट अनदेखा करें अनुभाग संक्षिप्त करें · %1$d अनुभाग विस्तृत करें diff --git a/core/presentation/src/commonMain/composeResources/values-it/strings-it.xml b/core/presentation/src/commonMain/composeResources/values-it/strings-it.xml index 825698f80..8f96c00d4 100644 --- a/core/presentation/src/commonMain/composeResources/values-it/strings-it.xml +++ b/core/presentation/src/commonMain/composeResources/values-it/strings-it.xml @@ -1008,8 +1008,10 @@ installazione in attesa pre-release attivo pronto da installare + aggiornamenti ignorati variante fissata variante obsoleta, azione richiesta + Ignora aggiornamenti Comprimi sezione · %1$d Espandi sezione diff --git a/core/presentation/src/commonMain/composeResources/values-ja/strings-ja.xml b/core/presentation/src/commonMain/composeResources/values-ja/strings-ja.xml index ddc26bbb7..764bc4c89 100644 --- a/core/presentation/src/commonMain/composeResources/values-ja/strings-ja.xml +++ b/core/presentation/src/commonMain/composeResources/values-ja/strings-ja.xml @@ -963,8 +963,10 @@ インストール保留中 プレリリース有効 インストール準備完了 + 更新を無視中 バリアント固定 バリアントが古いです、対応が必要 + 更新を無視 セクションを折りたたむ · %1$d セクションを展開 diff --git a/core/presentation/src/commonMain/composeResources/values-ko/strings-ko.xml b/core/presentation/src/commonMain/composeResources/values-ko/strings-ko.xml index 66f109c8d..0d7f1ef67 100644 --- a/core/presentation/src/commonMain/composeResources/values-ko/strings-ko.xml +++ b/core/presentation/src/commonMain/composeResources/values-ko/strings-ko.xml @@ -998,8 +998,10 @@ 설치 대기 중 프리릴리스 켜짐 설치 준비 완료 + 업데이트 무시됨 변형 고정됨 변형이 오래됨, 조치 필요 + 업데이트 무시 섹션 접기 · %1$d 섹션 펼치기 diff --git a/core/presentation/src/commonMain/composeResources/values-pl/strings-pl.xml b/core/presentation/src/commonMain/composeResources/values-pl/strings-pl.xml index 8b590d1f4..f114557de 100644 --- a/core/presentation/src/commonMain/composeResources/values-pl/strings-pl.xml +++ b/core/presentation/src/commonMain/composeResources/values-pl/strings-pl.xml @@ -989,8 +989,10 @@ oczekuje na instalację pre-release włączony gotowy do instalacji + aktualizacje zignorowane wariant przypięty wariant nieaktualny, wymagana akcja + Ignoruj aktualizacje Zwiń sekcję · %1$d Rozwiń sekcję diff --git a/core/presentation/src/commonMain/composeResources/values-ru/strings-ru.xml b/core/presentation/src/commonMain/composeResources/values-ru/strings-ru.xml index 1e23dff85..a2eec0b1f 100644 --- a/core/presentation/src/commonMain/composeResources/values-ru/strings-ru.xml +++ b/core/presentation/src/commonMain/composeResources/values-ru/strings-ru.xml @@ -989,8 +989,10 @@ установка в ожидании пре-релиз включён готов к установке + обновления игнорируются вариант закреплён вариант устарел, нужно действие + Игнорировать обновления Свернуть раздел · %1$d Развернуть раздел diff --git a/core/presentation/src/commonMain/composeResources/values-tr/strings-tr.xml b/core/presentation/src/commonMain/composeResources/values-tr/strings-tr.xml index 921927b71..75affb997 100644 --- a/core/presentation/src/commonMain/composeResources/values-tr/strings-tr.xml +++ b/core/presentation/src/commonMain/composeResources/values-tr/strings-tr.xml @@ -1005,8 +1005,10 @@ kurulum bekliyor ön sürüm açık kurulmaya hazır + güncellemeler yok sayıldı varyant sabitlendi varyant eski, işlem gerekli + Güncellemeleri yok say Bölümü daralt · %1$d Bölümü genişlet diff --git a/core/presentation/src/commonMain/composeResources/values-zh-rCN/strings-zh-rCN.xml b/core/presentation/src/commonMain/composeResources/values-zh-rCN/strings-zh-rCN.xml index a79d68f1f..85b5d28ba 100644 --- a/core/presentation/src/commonMain/composeResources/values-zh-rCN/strings-zh-rCN.xml +++ b/core/presentation/src/commonMain/composeResources/values-zh-rCN/strings-zh-rCN.xml @@ -965,8 +965,10 @@ 待安装 预发布已开启 可以安装 + 已忽略更新 变体已锁定 变体过期,需要处理 + 忽略更新 折叠分组 · %1$d 展开分组 diff --git a/core/presentation/src/commonMain/composeResources/values/strings.xml b/core/presentation/src/commonMain/composeResources/values/strings.xml index 31bf678dd..fccf878e2 100644 --- a/core/presentation/src/commonMain/composeResources/values/strings.xml +++ b/core/presentation/src/commonMain/composeResources/values/strings.xml @@ -1050,6 +1050,8 @@ variant stale, action needed pending install ready to install + updates ignored + Ignore updates Discard From 130c77a88b67c875779672e7a3cca9ed527cd99c Mon Sep 17 00:00:00 2001 From: rainxchzed Date: Thu, 7 May 2026 10:54:17 +0500 Subject: [PATCH 3/5] feat(apps): ignore-updates per-app toggle in apps list overflow (#536) --- .../rainxch/apps/presentation/AppsAction.kt | 3 + .../zed/rainxch/apps/presentation/AppsRoot.kt | 56 ++++++++++++++++++- .../apps/presentation/AppsViewModel.kt | 14 +++++ .../presentation/components/CompactAppRow.kt | 16 ++++++ .../components/StatusDotCluster.kt | 13 +++++ 5 files changed, 100 insertions(+), 2 deletions(-) diff --git a/feature/apps/presentation/src/commonMain/kotlin/zed/rainxch/apps/presentation/AppsAction.kt b/feature/apps/presentation/src/commonMain/kotlin/zed/rainxch/apps/presentation/AppsAction.kt index 63f79adb6..fbd36ccc5 100644 --- a/feature/apps/presentation/src/commonMain/kotlin/zed/rainxch/apps/presentation/AppsAction.kt +++ b/feature/apps/presentation/src/commonMain/kotlin/zed/rainxch/apps/presentation/AppsAction.kt @@ -71,6 +71,9 @@ sealed interface AppsAction { // Per-app pre-release toggle data class OnTogglePreReleases(val packageName: String, val enabled: Boolean) : AppsAction + // Per-app update-check toggle (issue #536: ignore updates for individual apps) + data class OnToggleUpdateCheck(val packageName: String, val enabled: Boolean) : AppsAction + // Per-app advanced settings sheet (monorepo) data class OnOpenAdvancedSettings(val app: InstalledAppUi) : AppsAction data object OnDismissAdvancedSettings : AppsAction diff --git a/feature/apps/presentation/src/commonMain/kotlin/zed/rainxch/apps/presentation/AppsRoot.kt b/feature/apps/presentation/src/commonMain/kotlin/zed/rainxch/apps/presentation/AppsRoot.kt index 71a35aaeb..f60aa1004 100644 --- a/feature/apps/presentation/src/commonMain/kotlin/zed/rainxch/apps/presentation/AppsRoot.kt +++ b/feature/apps/presentation/src/commonMain/kotlin/zed/rainxch/apps/presentation/AppsRoot.kt @@ -110,6 +110,8 @@ import zed.rainxch.githubstore.core.presentation.res.Res import zed.rainxch.githubstore.core.presentation.res.add_by_link import zed.rainxch.githubstore.core.presentation.res.add_from_starred_title import zed.rainxch.githubstore.core.presentation.res.advanced_settings_open +import zed.rainxch.githubstore.core.presentation.res.apps_compact_more_actions +import zed.rainxch.githubstore.core.presentation.res.apps_ignore_updates import zed.rainxch.githubstore.core.presentation.res.apps_section_up_to_date import zed.rainxch.githubstore.core.presentation.res.apps_section_updates_available import zed.rainxch.githubstore.core.presentation.res.install @@ -609,9 +611,13 @@ fun AppsScreen( // rows) and the "Up to date" group (compact rows) — issue #463. // Sort order is already applied by the ViewModel. val updatesGroup = - state.filteredApps.filter { it.installedApp.isUpdateAvailable } + state.filteredApps.filter { + it.installedApp.isUpdateAvailable && it.installedApp.updateCheckEnabled + } val idleGroup = - state.filteredApps.filter { !it.installedApp.isUpdateAvailable } + state.filteredApps.filter { + !it.installedApp.isUpdateAvailable || !it.installedApp.updateCheckEnabled + } ScrollbarContainer( listState = listState, @@ -670,6 +676,9 @@ fun AppsScreen( onTogglePreReleases = { enabled -> onAction(AppsAction.OnTogglePreReleases(appItem.installedApp.packageName, enabled)) }, + onToggleUpdateCheck = { enabled -> + onAction(AppsAction.OnToggleUpdateCheck(appItem.installedApp.packageName, enabled)) + }, onAdvancedSettingsClick = { onAction(AppsAction.OnOpenAdvancedSettings(appItem.installedApp)) }, @@ -741,6 +750,14 @@ fun AppsScreen( ), ) }, + onToggleUpdateCheck = { enabled -> + onAction( + AppsAction.OnToggleUpdateCheck( + appItem.installedApp.packageName, + enabled, + ), + ) + }, onRowClick = { onAction(AppsAction.OnNavigateToRepo(appItem.installedApp.repoId)) }, @@ -829,6 +846,7 @@ fun AppItemCard( onUninstallClick: () -> Unit, onRepoClick: () -> Unit, onTogglePreReleases: (Boolean) -> Unit, + onToggleUpdateCheck: (Boolean) -> Unit, onAdvancedSettingsClick: () -> Unit, onPickVariantClick: () -> Unit, onInstallPendingClick: () -> Unit, @@ -1074,6 +1092,40 @@ fun AppItemCard( contentDescription = preReleaseString }, ) + + var showRowOverflow by remember { mutableStateOf(false) } + val moreActionsLabel = + stringResource(Res.string.apps_compact_more_actions, app.appName) + Box { + IconButton( + onClick = { showRowOverflow = true }, + enabled = !isBusy, + modifier = Modifier.semantics { + contentDescription = moreActionsLabel + }, + ) { + Icon( + imageVector = Icons.Outlined.MoreVert, + contentDescription = null, + tint = MaterialTheme.colorScheme.onSurfaceVariant, + ) + } + DropdownMenu( + expanded = showRowOverflow, + onDismissRequest = { showRowOverflow = false }, + ) { + DropdownMenuItem( + text = { + val baseLabel = stringResource(Res.string.apps_ignore_updates) + Text(text = if (!app.updateCheckEnabled) "$baseLabel ✓" else baseLabel) + }, + onClick = { + showRowOverflow = false + onToggleUpdateCheck(!app.updateCheckEnabled) + }, + ) + } + } } } diff --git a/feature/apps/presentation/src/commonMain/kotlin/zed/rainxch/apps/presentation/AppsViewModel.kt b/feature/apps/presentation/src/commonMain/kotlin/zed/rainxch/apps/presentation/AppsViewModel.kt index 50dacc0af..a3c83b381 100644 --- a/feature/apps/presentation/src/commonMain/kotlin/zed/rainxch/apps/presentation/AppsViewModel.kt +++ b/feature/apps/presentation/src/commonMain/kotlin/zed/rainxch/apps/presentation/AppsViewModel.kt @@ -394,6 +394,10 @@ class AppsViewModel( togglePreReleases(action.packageName, action.enabled) } + is AppsAction.OnToggleUpdateCheck -> { + toggleUpdateCheck(action.packageName, action.enabled) + } + is AppsAction.OnOpenAdvancedSettings -> { openAdvancedSettings(action.app) } @@ -586,6 +590,16 @@ class AppsViewModel( } } + private fun toggleUpdateCheck(packageName: String, enabled: Boolean) { + viewModelScope.launch { + try { + installedAppsRepository.setUpdateCheckEnabled(packageName, enabled) + } catch (e: Exception) { + logger.error("Failed to toggle update check for $packageName: ${e.message}") + } + } + } + private fun openAdvancedSettings(app: InstalledAppUi) { _state.update { it.copy( diff --git a/feature/apps/presentation/src/commonMain/kotlin/zed/rainxch/apps/presentation/components/CompactAppRow.kt b/feature/apps/presentation/src/commonMain/kotlin/zed/rainxch/apps/presentation/components/CompactAppRow.kt index 220ca40cd..5bec289c0 100644 --- a/feature/apps/presentation/src/commonMain/kotlin/zed/rainxch/apps/presentation/components/CompactAppRow.kt +++ b/feature/apps/presentation/src/commonMain/kotlin/zed/rainxch/apps/presentation/components/CompactAppRow.kt @@ -60,6 +60,7 @@ import zed.rainxch.githubstore.core.presentation.res.apps_compact_status_pre_rel import zed.rainxch.githubstore.core.presentation.res.apps_compact_status_ready_to_install import zed.rainxch.githubstore.core.presentation.res.apps_compact_status_variant_pinned import zed.rainxch.githubstore.core.presentation.res.apps_compact_status_variant_stale +import zed.rainxch.githubstore.core.presentation.res.apps_ignore_updates import zed.rainxch.githubstore.core.presentation.res.install import zed.rainxch.githubstore.core.presentation.res.open import zed.rainxch.githubstore.core.presentation.res.pre_release_badge @@ -89,6 +90,7 @@ fun CompactAppRow( onPickVariantClick: () -> Unit, onUninstallClick: () -> Unit, onTogglePreReleases: (Boolean) -> Unit, + onToggleUpdateCheck: (Boolean) -> Unit, onRowClick: () -> Unit, modifier: Modifier = Modifier, ) { @@ -202,10 +204,12 @@ fun CompactAppRow( isPending = app.isPendingInstall, isUpdateAvailable = app.isUpdateAvailable, isPreReleaseEnabled = app.includePreReleases, + isUpdateCheckEnabled = app.updateCheckEnabled, onAdvancedSettingsClick = onAdvancedSettingsClick, onPickVariantClick = onPickVariantClick, onUninstallClick = onUninstallClick, onTogglePreReleases = onTogglePreReleases, + onToggleUpdateCheck = onToggleUpdateCheck, onDiscardPendingClick = onDiscardPendingClick, ) } @@ -218,10 +222,12 @@ private fun CompactRowOverflow( isPending: Boolean, isUpdateAvailable: Boolean, isPreReleaseEnabled: Boolean, + isUpdateCheckEnabled: Boolean, onAdvancedSettingsClick: () -> Unit, onPickVariantClick: () -> Unit, onUninstallClick: () -> Unit, onTogglePreReleases: (Boolean) -> Unit, + onToggleUpdateCheck: (Boolean) -> Unit, onDiscardPendingClick: () -> Unit, ) { var expanded by remember { mutableStateOf(false) } @@ -273,6 +279,16 @@ private fun CompactRowOverflow( onTogglePreReleases(!isPreReleaseEnabled) }, ) + DropdownMenuItem( + text = { + val baseLabel = stringResource(Res.string.apps_ignore_updates) + Text(text = if (!isUpdateCheckEnabled) "$baseLabel ✓" else baseLabel) + }, + onClick = { + expanded = false + onToggleUpdateCheck(!isUpdateCheckEnabled) + }, + ) if (isPending) { DropdownMenuItem( text = { diff --git a/feature/apps/presentation/src/commonMain/kotlin/zed/rainxch/apps/presentation/components/StatusDotCluster.kt b/feature/apps/presentation/src/commonMain/kotlin/zed/rainxch/apps/presentation/components/StatusDotCluster.kt index a19528b51..e252a4fdb 100644 --- a/feature/apps/presentation/src/commonMain/kotlin/zed/rainxch/apps/presentation/components/StatusDotCluster.kt +++ b/feature/apps/presentation/src/commonMain/kotlin/zed/rainxch/apps/presentation/components/StatusDotCluster.kt @@ -22,6 +22,7 @@ import zed.rainxch.githubstore.core.presentation.res.apps_compact_status_filter_ import zed.rainxch.githubstore.core.presentation.res.apps_compact_status_pending_install import zed.rainxch.githubstore.core.presentation.res.apps_compact_status_pre_release_on import zed.rainxch.githubstore.core.presentation.res.apps_compact_status_ready_to_install +import zed.rainxch.githubstore.core.presentation.res.apps_compact_status_updates_ignored import zed.rainxch.githubstore.core.presentation.res.apps_compact_status_variant_pinned import zed.rainxch.githubstore.core.presentation.res.apps_compact_status_variant_stale @@ -38,6 +39,7 @@ data class CompactStatusFlags( val preReleaseOn: Boolean = false, val pendingInstall: Boolean = false, val readyToInstall: Boolean = false, + val updatesIgnored: Boolean = false, ) /** @@ -56,6 +58,7 @@ fun rememberCompactStatusFlags(appItem: AppItem): CompactStatusFlags { app.includePreReleases, app.isPendingInstall, app.pendingInstallFilePath, + app.updateCheckEnabled, ) { CompactStatusFlags( filterActive = !app.assetFilterRegex.isNullOrBlank() || app.fallbackToOlderReleases, @@ -64,6 +67,7 @@ fun rememberCompactStatusFlags(appItem: AppItem): CompactStatusFlags { preReleaseOn = app.includePreReleases, pendingInstall = app.isPendingInstall && app.pendingInstallFilePath == null, readyToInstall = app.pendingInstallFilePath != null, + updatesIgnored = !app.updateCheckEnabled, ) } } @@ -88,6 +92,7 @@ fun StatusDotCluster( if (flags.variantPinned) add(StatusItem(DotShape.Diamond, cs.primary)) if (flags.filterActive) add(StatusItem(DotShape.Square, cs.primary)) if (flags.preReleaseOn) add(StatusItem(DotShape.Circle, cs.tertiary)) + if (flags.updatesIgnored) add(StatusItem(DotShape.Bar, cs.outline)) } if (items.isEmpty()) return @@ -113,6 +118,7 @@ private enum class DotShape { Diamond, Ring, Chevron, + Bar, } private fun DrawScope.drawShape(shape: DotShape, color: Color) { @@ -157,6 +163,12 @@ private fun DrawScope.drawShape(shape: DotShape, color: Color) { } drawPath(path, color, style = Stroke(width = 1.5f)) } + DotShape.Bar -> + drawRect( + color = color, + topLeft = androidx.compose.ui.geometry.Offset(0f, s * 0.4f), + size = androidx.compose.ui.geometry.Size(s, s * 0.2f), + ) } } @@ -180,6 +192,7 @@ fun buildCompactRowSemantics( if (flags.variantPinned) add(stringResource(Res.string.apps_compact_status_variant_pinned)) if (flags.filterActive) add(stringResource(Res.string.apps_compact_status_filter_active)) if (flags.preReleaseOn) add(stringResource(Res.string.apps_compact_status_pre_release_on)) + if (flags.updatesIgnored) add(stringResource(Res.string.apps_compact_status_updates_ignored)) } return parts.joinToString(", ") } From 40c0f72606d90ee30cc433504c36f8c7231a39be Mon Sep 17 00:00:00 2001 From: rainxchzed Date: Thu, 7 May 2026 10:54:24 +0500 Subject: [PATCH 4/5] chore(whatsnew): seed 1.9.0 (versionCode 17) with ignore-updates bullet across 13 locales --- .../composeResources/files/whatsnew/17.json | 14 ++++++++++++++ .../composeResources/files/whatsnew/ar/17.json | 14 ++++++++++++++ .../composeResources/files/whatsnew/bn/17.json | 14 ++++++++++++++ .../composeResources/files/whatsnew/es/17.json | 14 ++++++++++++++ .../composeResources/files/whatsnew/fr/17.json | 14 ++++++++++++++ .../composeResources/files/whatsnew/hi/17.json | 14 ++++++++++++++ .../composeResources/files/whatsnew/it/17.json | 14 ++++++++++++++ .../composeResources/files/whatsnew/ja/17.json | 14 ++++++++++++++ .../composeResources/files/whatsnew/ko/17.json | 14 ++++++++++++++ .../composeResources/files/whatsnew/pl/17.json | 14 ++++++++++++++ .../composeResources/files/whatsnew/ru/17.json | 14 ++++++++++++++ .../composeResources/files/whatsnew/tr/17.json | 14 ++++++++++++++ .../composeResources/files/whatsnew/zh-CN/17.json | 14 ++++++++++++++ 13 files changed, 182 insertions(+) create mode 100644 core/presentation/src/commonMain/composeResources/files/whatsnew/17.json create mode 100644 core/presentation/src/commonMain/composeResources/files/whatsnew/ar/17.json create mode 100644 core/presentation/src/commonMain/composeResources/files/whatsnew/bn/17.json create mode 100644 core/presentation/src/commonMain/composeResources/files/whatsnew/es/17.json create mode 100644 core/presentation/src/commonMain/composeResources/files/whatsnew/fr/17.json create mode 100644 core/presentation/src/commonMain/composeResources/files/whatsnew/hi/17.json create mode 100644 core/presentation/src/commonMain/composeResources/files/whatsnew/it/17.json create mode 100644 core/presentation/src/commonMain/composeResources/files/whatsnew/ja/17.json create mode 100644 core/presentation/src/commonMain/composeResources/files/whatsnew/ko/17.json create mode 100644 core/presentation/src/commonMain/composeResources/files/whatsnew/pl/17.json create mode 100644 core/presentation/src/commonMain/composeResources/files/whatsnew/ru/17.json create mode 100644 core/presentation/src/commonMain/composeResources/files/whatsnew/tr/17.json create mode 100644 core/presentation/src/commonMain/composeResources/files/whatsnew/zh-CN/17.json diff --git a/core/presentation/src/commonMain/composeResources/files/whatsnew/17.json b/core/presentation/src/commonMain/composeResources/files/whatsnew/17.json new file mode 100644 index 000000000..580824893 --- /dev/null +++ b/core/presentation/src/commonMain/composeResources/files/whatsnew/17.json @@ -0,0 +1,14 @@ +{ + "versionCode": 17, + "versionName": "1.9.0", + "releaseDate": "2026-05-07", + "showAsSheet": true, + "sections": [ + { + "type": "NEW", + "bullets": [ + "Ignore updates per app — silence the update badge for any app you don't want to update." + ] + } + ] +} diff --git a/core/presentation/src/commonMain/composeResources/files/whatsnew/ar/17.json b/core/presentation/src/commonMain/composeResources/files/whatsnew/ar/17.json new file mode 100644 index 000000000..7c66ebe50 --- /dev/null +++ b/core/presentation/src/commonMain/composeResources/files/whatsnew/ar/17.json @@ -0,0 +1,14 @@ +{ + "versionCode": 17, + "versionName": "1.9.0", + "releaseDate": "2026-05-07", + "showAsSheet": true, + "sections": [ + { + "type": "NEW", + "bullets": [ + "تجاهل التحديثات لكل تطبيق — أوقف تنبيه التحديث لأي تطبيق لا ترغب في تحديثه." + ] + } + ] +} diff --git a/core/presentation/src/commonMain/composeResources/files/whatsnew/bn/17.json b/core/presentation/src/commonMain/composeResources/files/whatsnew/bn/17.json new file mode 100644 index 000000000..379abfbc8 --- /dev/null +++ b/core/presentation/src/commonMain/composeResources/files/whatsnew/bn/17.json @@ -0,0 +1,14 @@ +{ + "versionCode": 17, + "versionName": "1.9.0", + "releaseDate": "2026-05-07", + "showAsSheet": true, + "sections": [ + { + "type": "NEW", + "bullets": [ + "প্রতিটি অ্যাপের আপডেট উপেক্ষা করুন — যে অ্যাপটি আপডেট করতে চান না, তার আপডেট ব্যাজ বন্ধ করে দিন।" + ] + } + ] +} diff --git a/core/presentation/src/commonMain/composeResources/files/whatsnew/es/17.json b/core/presentation/src/commonMain/composeResources/files/whatsnew/es/17.json new file mode 100644 index 000000000..29f0b007c --- /dev/null +++ b/core/presentation/src/commonMain/composeResources/files/whatsnew/es/17.json @@ -0,0 +1,14 @@ +{ + "versionCode": 17, + "versionName": "1.9.0", + "releaseDate": "2026-05-07", + "showAsSheet": true, + "sections": [ + { + "type": "NEW", + "bullets": [ + "Ignorar actualizaciones por app — silencia la insignia de actualización en cualquier app que no quieras actualizar." + ] + } + ] +} diff --git a/core/presentation/src/commonMain/composeResources/files/whatsnew/fr/17.json b/core/presentation/src/commonMain/composeResources/files/whatsnew/fr/17.json new file mode 100644 index 000000000..aeccdf039 --- /dev/null +++ b/core/presentation/src/commonMain/composeResources/files/whatsnew/fr/17.json @@ -0,0 +1,14 @@ +{ + "versionCode": 17, + "versionName": "1.9.0", + "releaseDate": "2026-05-07", + "showAsSheet": true, + "sections": [ + { + "type": "NEW", + "bullets": [ + "Ignorer les mises à jour par appli — masque la pastille de mise à jour pour les applis que tu ne veux pas mettre à jour." + ] + } + ] +} diff --git a/core/presentation/src/commonMain/composeResources/files/whatsnew/hi/17.json b/core/presentation/src/commonMain/composeResources/files/whatsnew/hi/17.json new file mode 100644 index 000000000..d9765fc48 --- /dev/null +++ b/core/presentation/src/commonMain/composeResources/files/whatsnew/hi/17.json @@ -0,0 +1,14 @@ +{ + "versionCode": 17, + "versionName": "1.9.0", + "releaseDate": "2026-05-07", + "showAsSheet": true, + "sections": [ + { + "type": "NEW", + "bullets": [ + "हर ऐप के अपडेट अनदेखा करें — जिस ऐप को अपडेट नहीं करना चाहते, उसका अपडेट बैज छिपा दें।" + ] + } + ] +} diff --git a/core/presentation/src/commonMain/composeResources/files/whatsnew/it/17.json b/core/presentation/src/commonMain/composeResources/files/whatsnew/it/17.json new file mode 100644 index 000000000..971887d81 --- /dev/null +++ b/core/presentation/src/commonMain/composeResources/files/whatsnew/it/17.json @@ -0,0 +1,14 @@ +{ + "versionCode": 17, + "versionName": "1.9.0", + "releaseDate": "2026-05-07", + "showAsSheet": true, + "sections": [ + { + "type": "NEW", + "bullets": [ + "Ignora aggiornamenti per app — silenzia la notifica di aggiornamento per le app che non vuoi aggiornare." + ] + } + ] +} diff --git a/core/presentation/src/commonMain/composeResources/files/whatsnew/ja/17.json b/core/presentation/src/commonMain/composeResources/files/whatsnew/ja/17.json new file mode 100644 index 000000000..eb058ff45 --- /dev/null +++ b/core/presentation/src/commonMain/composeResources/files/whatsnew/ja/17.json @@ -0,0 +1,14 @@ +{ + "versionCode": 17, + "versionName": "1.9.0", + "releaseDate": "2026-05-07", + "showAsSheet": true, + "sections": [ + { + "type": "NEW", + "bullets": [ + "アプリごとに更新を無視 — 更新したくないアプリの更新バッジを非表示にできるようになりました。" + ] + } + ] +} diff --git a/core/presentation/src/commonMain/composeResources/files/whatsnew/ko/17.json b/core/presentation/src/commonMain/composeResources/files/whatsnew/ko/17.json new file mode 100644 index 000000000..4b7a00b43 --- /dev/null +++ b/core/presentation/src/commonMain/composeResources/files/whatsnew/ko/17.json @@ -0,0 +1,14 @@ +{ + "versionCode": 17, + "versionName": "1.9.0", + "releaseDate": "2026-05-07", + "showAsSheet": true, + "sections": [ + { + "type": "NEW", + "bullets": [ + "앱별 업데이트 무시 — 업데이트하고 싶지 않은 앱의 업데이트 배지를 숨길 수 있어요." + ] + } + ] +} diff --git a/core/presentation/src/commonMain/composeResources/files/whatsnew/pl/17.json b/core/presentation/src/commonMain/composeResources/files/whatsnew/pl/17.json new file mode 100644 index 000000000..391525518 --- /dev/null +++ b/core/presentation/src/commonMain/composeResources/files/whatsnew/pl/17.json @@ -0,0 +1,14 @@ +{ + "versionCode": 17, + "versionName": "1.9.0", + "releaseDate": "2026-05-07", + "showAsSheet": true, + "sections": [ + { + "type": "NEW", + "bullets": [ + "Ignorowanie aktualizacji per aplikacja — wycisz powiadomienie o aktualizacji dla dowolnej aplikacji, której nie chcesz aktualizować." + ] + } + ] +} diff --git a/core/presentation/src/commonMain/composeResources/files/whatsnew/ru/17.json b/core/presentation/src/commonMain/composeResources/files/whatsnew/ru/17.json new file mode 100644 index 000000000..8c7eda075 --- /dev/null +++ b/core/presentation/src/commonMain/composeResources/files/whatsnew/ru/17.json @@ -0,0 +1,14 @@ +{ + "versionCode": 17, + "versionName": "1.9.0", + "releaseDate": "2026-05-07", + "showAsSheet": true, + "sections": [ + { + "type": "NEW", + "bullets": [ + "Игнорировать обновления для отдельного приложения — отключите значок обновления у любого приложения, которое не хотите обновлять." + ] + } + ] +} diff --git a/core/presentation/src/commonMain/composeResources/files/whatsnew/tr/17.json b/core/presentation/src/commonMain/composeResources/files/whatsnew/tr/17.json new file mode 100644 index 000000000..11f3c3f60 --- /dev/null +++ b/core/presentation/src/commonMain/composeResources/files/whatsnew/tr/17.json @@ -0,0 +1,14 @@ +{ + "versionCode": 17, + "versionName": "1.9.0", + "releaseDate": "2026-05-07", + "showAsSheet": true, + "sections": [ + { + "type": "NEW", + "bullets": [ + "Uygulama bazında güncelleme yok say — güncellemek istemediğin uygulamaların güncelleme rozetini sustur." + ] + } + ] +} diff --git a/core/presentation/src/commonMain/composeResources/files/whatsnew/zh-CN/17.json b/core/presentation/src/commonMain/composeResources/files/whatsnew/zh-CN/17.json new file mode 100644 index 000000000..6fb5eb534 --- /dev/null +++ b/core/presentation/src/commonMain/composeResources/files/whatsnew/zh-CN/17.json @@ -0,0 +1,14 @@ +{ + "versionCode": 17, + "versionName": "1.9.0", + "releaseDate": "2026-05-07", + "showAsSheet": true, + "sections": [ + { + "type": "NEW", + "bullets": [ + "按应用忽略更新 — 不想更新的应用,可以单独隐藏其更新提示。" + ] + } + ] +} From d17c97bab0c1e902d6a5efcf4451a0eaf90391e9 Mon Sep 17 00:00:00 2001 From: rainxchzed Date: Thu, 7 May 2026 11:08:45 +0500 Subject: [PATCH 5/5] =?UTF-8?q?fix(apps):=20coderabbit=20pass=20=E2=80=94?= =?UTF-8?q?=20pl/hi/it=20phrasing,=20rethrow=20CancellationException,=20ga?= =?UTF-8?q?te=20Update=20All=20on=20updateCheckEnabled?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../commonMain/composeResources/files/whatsnew/pl/17.json | 2 +- .../src/commonMain/composeResources/values-hi/strings-hi.xml | 2 +- .../src/commonMain/composeResources/values-it/strings-it.xml | 2 +- .../kotlin/zed/rainxch/apps/presentation/AppsRoot.kt | 5 ++++- .../kotlin/zed/rainxch/apps/presentation/AppsViewModel.kt | 2 ++ 5 files changed, 9 insertions(+), 4 deletions(-) diff --git a/core/presentation/src/commonMain/composeResources/files/whatsnew/pl/17.json b/core/presentation/src/commonMain/composeResources/files/whatsnew/pl/17.json index 391525518..26b16f0c8 100644 --- a/core/presentation/src/commonMain/composeResources/files/whatsnew/pl/17.json +++ b/core/presentation/src/commonMain/composeResources/files/whatsnew/pl/17.json @@ -7,7 +7,7 @@ { "type": "NEW", "bullets": [ - "Ignorowanie aktualizacji per aplikacja — wycisz powiadomienie o aktualizacji dla dowolnej aplikacji, której nie chcesz aktualizować." + "Ignorowanie aktualizacji dla każdej aplikacji — wycisz powiadomienie o aktualizacji dla dowolnej aplikacji, której nie chcesz aktualizować." ] } ] diff --git a/core/presentation/src/commonMain/composeResources/values-hi/strings-hi.xml b/core/presentation/src/commonMain/composeResources/values-hi/strings-hi.xml index b56f8a3b4..053687266 100644 --- a/core/presentation/src/commonMain/composeResources/values-hi/strings-hi.xml +++ b/core/presentation/src/commonMain/composeResources/values-hi/strings-hi.xml @@ -1007,7 +1007,7 @@ इंस्टॉल लंबित प्री-रिलीज़ चालू इंस्टॉल के लिए तैयार - अपडेट अनदेखा किए गए + अपडेट अनदेखे किए गए वैरिएंट पिन किया गया वैरिएंट पुराना, कार्रवाई आवश्यक अपडेट अनदेखा करें diff --git a/core/presentation/src/commonMain/composeResources/values-it/strings-it.xml b/core/presentation/src/commonMain/composeResources/values-it/strings-it.xml index 8f96c00d4..a454eefcf 100644 --- a/core/presentation/src/commonMain/composeResources/values-it/strings-it.xml +++ b/core/presentation/src/commonMain/composeResources/values-it/strings-it.xml @@ -1011,7 +1011,7 @@ aggiornamenti ignorati variante fissata variante obsoleta, azione richiesta - Ignora aggiornamenti + Ignora gli aggiornamenti Comprimi sezione · %1$d Espandi sezione diff --git a/feature/apps/presentation/src/commonMain/kotlin/zed/rainxch/apps/presentation/AppsRoot.kt b/feature/apps/presentation/src/commonMain/kotlin/zed/rainxch/apps/presentation/AppsRoot.kt index f60aa1004..8e5693104 100644 --- a/feature/apps/presentation/src/commonMain/kotlin/zed/rainxch/apps/presentation/AppsRoot.kt +++ b/feature/apps/presentation/src/commonMain/kotlin/zed/rainxch/apps/presentation/AppsRoot.kt @@ -548,7 +548,10 @@ fun AppsScreen( ) } - val hasUpdates = state.apps.any { it.installedApp.isUpdateAvailable } + val hasUpdates = + state.apps.any { + it.installedApp.isUpdateAvailable && it.installedApp.updateCheckEnabled + } if (hasUpdates && !state.isUpdatingAll) { Button( onClick = { onAction(AppsAction.OnUpdateAll) }, diff --git a/feature/apps/presentation/src/commonMain/kotlin/zed/rainxch/apps/presentation/AppsViewModel.kt b/feature/apps/presentation/src/commonMain/kotlin/zed/rainxch/apps/presentation/AppsViewModel.kt index a3c83b381..39872178a 100644 --- a/feature/apps/presentation/src/commonMain/kotlin/zed/rainxch/apps/presentation/AppsViewModel.kt +++ b/feature/apps/presentation/src/commonMain/kotlin/zed/rainxch/apps/presentation/AppsViewModel.kt @@ -594,6 +594,8 @@ class AppsViewModel( viewModelScope.launch { try { installedAppsRepository.setUpdateCheckEnabled(packageName, enabled) + } catch (e: CancellationException) { + throw e } catch (e: Exception) { logger.error("Failed to toggle update check for $packageName: ${e.message}") }