Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,14 @@ class GithubStoreApp : Application() {
private fun scheduleBackgroundUpdateChecks() {
appScope.launch {
try {
val intervalHours = get<TweaksRepository>().getUpdateCheckInterval().first()
val tweaks = get<TweaksRepository>()
val enabled = tweaks.getUpdateCheckEnabled().first()
if (!enabled) {
UpdateScheduler.cancel(this@GithubStoreApp)
Logger.i { "Background update check disabled — skipping schedule" }
return@launch
}
val intervalHours = tweaks.getUpdateCheckInterval().first()
UpdateScheduler.schedule(
context = this@GithubStoreApp,
intervalHours = intervalHours,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,8 @@ class AndroidUpdateScheduleManager(
override fun reschedule(intervalHours: Long) {
UpdateScheduler.reschedule(context, intervalHours)
}

override fun cancel() {
UpdateScheduler.cancel(context)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,38 @@ import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import co.touchlab.kermit.Logger
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.runBlocking
import org.koin.core.context.GlobalContext
import zed.rainxch.core.domain.repository.TweaksRepository

/**
* Reschedules periodic update checks after device reboot.
* Registered statically in AndroidManifest.xml.
*/
class BootReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent?) {
if (intent?.action == Intent.ACTION_BOOT_COMPLETED) {
Logger.i { "BootReceiver: Device booted, scheduling update checks" }
UpdateScheduler.schedule(context)
if (intent?.action != Intent.ACTION_BOOT_COMPLETED) return
val pendingResult = goAsync()
try {
val enabled =
runCatching {
runBlocking {
GlobalContext.get().get<TweaksRepository>().getUpdateCheckEnabled().first()
}
}.getOrElse {
Logger.w(it) { "BootReceiver: Failed to read update-check flag, defaulting to enabled" }
true
}
if (enabled) {
Logger.i { "BootReceiver: Device booted, scheduling update checks" }
UpdateScheduler.schedule(context)
} else {
Logger.i { "BootReceiver: Device booted, update check disabled — skipping" }
UpdateScheduler.cancel(context)
}
} finally {
pendingResult.finish()
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,17 @@ class TweaksRepositoryImpl(
}
}

override fun getUpdateCheckEnabled(): Flow<Boolean> =
preferences.data.map { prefs ->
prefs[UPDATE_CHECK_ENABLED_KEY] ?: true
}

override suspend fun setUpdateCheckEnabled(enabled: Boolean) {
preferences.edit { prefs ->
prefs[UPDATE_CHECK_ENABLED_KEY] = enabled
}
}

override fun getUpdateCheckInterval(): Flow<Long> =
preferences.data.map { prefs ->
prefs[UPDATE_CHECK_INTERVAL_KEY] ?: DEFAULT_UPDATE_CHECK_INTERVAL_HOURS
Expand Down Expand Up @@ -409,6 +420,7 @@ class TweaksRepositoryImpl(
private val INSTALLER_TYPE_KEY = stringPreferencesKey("installer_type")
private val INSTALLER_ATTRIBUTION_KEY = stringPreferencesKey("installer_attribution")
private val AUTO_UPDATE_KEY = booleanPreferencesKey("auto_update_enabled")
private val UPDATE_CHECK_ENABLED_KEY = booleanPreferencesKey("update_check_enabled")
private val UPDATE_CHECK_INTERVAL_KEY = longPreferencesKey("update_check_interval_hours")
private val INCLUDE_PRE_RELEASES_KEY = booleanPreferencesKey("include_pre_releases")
private val HIDE_SEEN_ENABLED_KEY = booleanPreferencesKey("hide_seen_enabled")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,8 @@ class DesktopUpdateScheduleManager : UpdateScheduleManager {
override fun reschedule(intervalHours: Long) {
// No background scheduler on Desktop
}

override fun cancel() {
// No background scheduler on Desktop
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,10 @@ interface TweaksRepository {

suspend fun setAutoUpdateEnabled(enabled: Boolean)

fun getUpdateCheckEnabled(): Flow<Boolean>

suspend fun setUpdateCheckEnabled(enabled: Boolean)

fun getUpdateCheckInterval(): Flow<Long>

suspend fun setUpdateCheckInterval(hours: Long)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,10 @@ interface UpdateScheduleManager {
* Takes effect immediately (replaces existing schedule).
*/
fun reschedule(intervalHours: Long)

/**
* Cancels every pending update-check / auto-update worker. Used
* when the user disables background update checking entirely.
*/
fun cancel()
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@
"Manual rescan surfaces every GitHub-style app on device.",
"Tighter auth handling — transient 401s no longer trigger spurious sign-outs.",
"Open-issues count now shown to everyone, including signed-out users — the count now comes from the backend.",
"License now shown for every repo regardless of sign-in state — sourced from backend, no more GitHub quota cost per Details open."
"License now shown for every repo regardless of sign-in state — sourced from backend, no more GitHub quota cost per Details open.",
"Background update check can be turned off entirely — saves battery if you'd rather check for updates manually."
]
},
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@
"إعادة المسح اليدوي تُظهر كل تطبيقات GitHub الموجودة على الجهاز دون تفويت أيّ منها.",
"معالجة أكثر صرامة للمصادقة: استجابات 401 العابرة لم تعد تتسبّب في تسجيل خروج خاطئ.",
"عداد المشكلات المفتوحة يظهر الآن للجميع بمن فيهم غير المسجَّلين — يأتي من الخادم الخلفي دون أي تكلفة لحصص GitHub.",
"الترخيص يظهر الآن لكل مستودع بصرف النظر عن حالة تسجيل الدخول — يأتي من الخادم الخلفي بدون أي استهلاك لحصص GitHub عند فتح صفحة التفاصيل."
"الترخيص يظهر الآن لكل مستودع بصرف النظر عن حالة تسجيل الدخول — يأتي من الخادم الخلفي بدون أي استهلاك لحصص GitHub عند فتح صفحة التفاصيل.",
"يمكنك إيقاف التحقق التلقائي من التحديثات في الخلفية بالكامل — يوفّر البطارية إذا كنت تفضّل التحقق يدوياً."
]
},
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@
"ম্যানুয়াল রি-স্ক্যান এখন ডিভাইসে থাকা সব GitHub-ধাঁচের অ্যাপ তুলে আনে।",
"অথেনটিকেশন আরও সংযত: সাময়িক 401 আর ভুল করে সাইন-আউট ঘটায় না।",
"ওপেন ইস্যুর সংখ্যা এখন সবাইকে দেখানো হয়, এমনকি সাইন-ইন না করা ব্যবহারকারীদেরও — ব্যাকএন্ড থেকে আসে, GitHub কোটায় কোনো খরচ নেই।",
"লাইসেন্স এখন প্রতিটি রিপোর জন্য সাইন-ইন স্ট্যাটাস নির্বিশেষে দেখানো হয় — ব্যাকএন্ড থেকে আসে, ডিটেইলস খোলার সময় GitHub কোটায় আর কোনো খরচ নেই।"
"লাইসেন্স এখন প্রতিটি রিপোর জন্য সাইন-ইন স্ট্যাটাস নির্বিশেষে দেখানো হয় — ব্যাকএন্ড থেকে আসে, ডিটেইলস খোলার সময় GitHub কোটায় আর কোনো খরচ নেই।",
"ব্যাকগ্রাউন্ড আপডেট চেক পুরোপুরি বন্ধ করা যায় — ম্যানুয়ালি চেক করতে চাইলে ব্যাটারি বাঁচে।"
]
},
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@
"El reescaneo manual muestra todas las apps tipo GitHub presentes en el dispositivo.",
"Mejor manejo de autenticación: los 401 transitorios ya no provocan cierres de sesión espurios.",
"El número de incidencias abiertas ahora se muestra a todos, incluidos los usuarios sin sesión — viene del backend, sin coste de cuota de GitHub.",
"La licencia ahora se muestra para cada repo independientemente del estado de inicio de sesión — viene del backend, sin coste de cuota de GitHub al abrir Detalles."
"La licencia ahora se muestra para cada repo independientemente del estado de inicio de sesión — viene del backend, sin coste de cuota de GitHub al abrir Detalles.",
"La comprobación de actualizaciones en segundo plano se puede desactivar por completo — ahorra batería si prefieres comprobar manualmente."
]
},
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@
"Le rescan manuel fait remonter toutes les apps de type GitHub présentes sur l’appareil.",
"Gestion d’authentification renforcée : les 401 transitoires ne déconnectent plus à tort.",
"Le nombre d’issues ouvertes s’affiche désormais pour tout le monde, y compris les utilisateurs déconnectés — fourni par le backend, sans coût de quota GitHub.",
"La licence s’affiche désormais pour chaque dépôt, peu importe l’état de connexion — fournie par le backend, sans coût de quota GitHub à l’ouverture des Détails."
"La licence s’affiche désormais pour chaque dépôt, peu importe l’état de connexion — fournie par le backend, sans coût de quota GitHub à l’ouverture des Détails.",
"La vérification des mises à jour en arrière-plan peut être complètement désactivée — économise la batterie si vous préférez vérifier manuellement."
]
},
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@
"मैन्युअल रीस्कैन डिवाइस पर मौजूद हर GitHub-शैली के ऐप को सामने ले आता है।",
"ऑथ हैंडलिंग पहले से बेहतर: अस्थायी 401 अब ग़लती से साइन-आउट नहीं कराते।",
"खुले इश्यू की संख्या अब सभी को दिखाई देती है, यहाँ तक कि साइन-आउट उपयोगकर्ताओं को भी — बैकएंड से आती है, GitHub कोटे पर कोई असर नहीं।",
"लाइसेंस अब हर रेपो के लिए साइन-इन की स्थिति की परवाह किए बिना दिखता है — बैकएंड से आता है, विवरण खोलने पर अब GitHub कोटा खर्च नहीं होता।"
"लाइसेंस अब हर रेपो के लिए साइन-इन की स्थिति की परवाह किए बिना दिखता है — बैकएंड से आता है, विवरण खोलने पर अब GitHub कोटा खर्च नहीं होता।",
"बैकग्राउंड अपडेट जाँच को पूरी तरह बंद किया जा सकता है — मैन्युअल जाँच पसंद करते हैं तो बैटरी बचती है।"
]
},
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@
"La rilevazione manuale mostra tutte le app di tipo GitHub presenti sul dispositivo.",
"Gestione dell’autenticazione più solida: i 401 transitori non causano più disconnessioni indebite.",
"Il conteggio delle issue aperte ora è visibile a tutti, anche agli utenti non autenticati — arriva dal backend, senza costi di quota GitHub.",
"La licenza ora è mostrata per ogni repo indipendentemente dallo stato di accesso — arriva dal backend, senza costi di quota GitHub all’apertura dei Dettagli."
"La licenza ora è mostrata per ogni repo indipendentemente dallo stato di accesso — arriva dal backend, senza costi di quota GitHub all’apertura dei Dettagli.",
"La verifica aggiornamenti in background può essere disattivata del tutto — risparmia batteria se preferisci verificare manualmente."
]
},
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@
"手動での再スキャンで、端末上の GitHub 系アプリをすべて検出するようになりました。",
"認証エラー処理を強化。一時的な 401 で誤ってサインアウトされなくなりました。",
"オープン Issue 数を未ログインユーザーを含む全員に表示。バックエンドから取得するため GitHub のクォータを消費しません。",
"ライセンスをサインイン状態に関係なく全リポジトリで表示。バックエンドから取得するため、詳細画面を開いても GitHub のクォータを消費しません。"
"ライセンスをサインイン状態に関係なく全リポジトリで表示。バックエンドから取得するため、詳細画面を開いても GitHub のクォータを消費しません。",
"バックグラウンドの更新確認を完全にオフにできます — 手動でチェックしたい場合はバッテリーを節約できます。"
]
},
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@
"수동 재스캔이 기기의 모든 GitHub 계열 앱을 빠짐없이 표시합니다.",
"인증 처리 강화: 일시적인 401로 인해 잘못 로그아웃되지 않습니다.",
"열린 이슈 수가 이제 로그아웃 사용자를 포함한 모두에게 표시됩니다 — 백엔드에서 제공되며 GitHub 할당량을 소비하지 않습니다.",
"라이선스가 로그인 여부와 관계없이 모든 저장소에 표시됩니다 — 백엔드에서 제공되며 세부 정보를 열어도 GitHub 할당량을 소비하지 않습니다."
"라이선스가 로그인 여부와 관계없이 모든 저장소에 표시됩니다 — 백엔드에서 제공되며 세부 정보를 열어도 GitHub 할당량을 소비하지 않습니다.",
"백그라운드 업데이트 확인을 완전히 끌 수 있습니다 — 수동으로 확인하고 싶다면 배터리를 절약합니다."
]
},
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@
"Ręczne ponowne skanowanie pokazuje wszystkie aplikacje z GitHuba obecne na urządzeniu.",
"Stabilniejsza obsługa autoryzacji — przejściowe 401 nie powodują już fałszywych wylogowań.",
"Liczba otwartych zgłoszeń jest teraz pokazywana wszystkim, także użytkownikom niezalogowanym — pochodzi z backendu, bez kosztów limitu GitHuba.",
"Licencja jest teraz pokazywana dla każdego repo niezależnie od stanu zalogowania — pochodzi z backendu, bez kosztów limitu GitHuba przy otwieraniu Szczegółów."
"Licencja jest teraz pokazywana dla każdego repo niezależnie od stanu zalogowania — pochodzi z backendu, bez kosztów limitu GitHuba przy otwieraniu Szczegółów.",
"Sprawdzanie aktualizacji w tle można całkowicie wyłączyć — oszczędza baterię, jeśli wolisz sprawdzać ręcznie."
]
},
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@
"Ручное пересканирование показывает все приложения GitHub-типа на устройстве.",
"Аккуратная обработка авторизации: единичные 401 больше не вызывают ложный выход из аккаунта.",
"Количество открытых задач теперь видно всем, в том числе неавторизованным пользователям — берётся из бэкенда, без расхода квоты GitHub.",
"Лицензия теперь видна для каждого репозитория независимо от статуса входа — берётся из бэкенда, без расхода квоты GitHub при открытии деталей."
"Лицензия теперь видна для каждого репозитория независимо от статуса входа — берётся из бэкенда, без расхода квоты GitHub при открытии деталей.",
"Фоновую проверку обновлений можно полностью отключить — экономит батарею, если предпочитаете проверять вручную."
]
},
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@
"Manuel yeniden tarama, cihazdaki tüm GitHub tipi uygulamaları görünür kılıyor.",
"Daha sağlam kimlik doğrulama: geçici 401 yanıtları artık yanlışlıkla oturumu kapatmıyor.",
"Açık konu sayısı artık oturum açmamış kullanıcılar dahil herkese gösteriliyor — backend'den geliyor, GitHub kotası harcamıyor.",
"Lisans artık oturum durumundan bağımsız olarak her depo için gösteriliyor — backend'den geliyor, Detayları açarken GitHub kotası harcanmıyor."
"Lisans artık oturum durumundan bağımsız olarak her depo için gösteriliyor — backend'den geliyor, Detayları açarken GitHub kotası harcanmıyor.",
"Arka plan güncelleme kontrolü tamamen kapatılabiliyor — manuel kontrolü tercih ediyorsanız pil tasarrufu sağlar."
]
},
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@
"手动重新扫描会列出设备上所有 GitHub 风格的应用,不再漏报。",
"更稳健的鉴权处理:偶发的 401 不会再让你被错误地踢出登录。",
"未登录用户也能看到「Open Issues」数量了 — 数据来自后端,不消耗任何 GitHub 配额。",
"无论是否登录,每个仓库都会显示许可证信息 — 数据来自后端,打开详情页不再消耗 GitHub 配额。"
"无论是否登录,每个仓库都会显示许可证信息 — 数据来自后端,打开详情页不再消耗 GitHub 配额。",
"可完全关闭后台更新检查 — 如果你更喜欢手动检查,这能省电。"
]
},
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -565,6 +565,8 @@
<string name="section_updates">التحديثات</string>
<string name="update_check_interval_title">فترة التحقق من التحديثات</string>
<string name="update_check_interval_description">عدد مرات التحقق من تحديثات التطبيق في الخلفية</string>
<string name="update_check_enabled_title">التحقق التلقائي من التحديثات</string>
<string name="update_check_enabled_description">يبحث عن التحديثات في الخلفية بشكل دوري. أوقفه لتوفير البطارية — يمكنك دائماً التحقق يدوياً من شاشة تفاصيل أي تطبيق.</string>
<string name="interval_3h">٣ ساعات</string>
<string name="interval_6h">٦ ساعات</string>
<string name="interval_12h">١٢ ساعة</string>
Expand Down
Loading