Skip to content

Commit 5362bc9

Browse files
committed
feat(app): Remove in-app uninstallation and refine downgrade handling
This commit removes the ability to uninstall applications directly from the app's interface across Android and Desktop platforms. It also refines the downgrade process by replacing the automatic uninstall prompt with a manual instruction message. - **feat(core)**: Removed `uninstall` method from the `Installer` interface and its Android/Desktop implementations. - **feat(app)**: Removed `UninstallApp` and `OnUninstallApp` actions from `DetailsViewModel` and `AppsViewModel`. - **ui(details)**: Simplified `SmartInstallButton` to only show an "Open" button when the same version is installed, removing the split "Uninstall/Open" layout. - **ui(details)**: Replaced the `ShowDowngradeWarning` dialog in `DetailsRoot` with a simple snackbar message instructing the user to uninstall manually. - **ui(apps)**: Removed the uninstall icon button from the installed apps list. - **fix(network)**: Hardened `GitHubClientProvider` initialization by adding a 1.5s timeout and `runCatching` when fetching proxy configurations to prevent potential startup hangs. - **i18n**: Updated strings across all supported languages to reflect the removal of uninstallation features and add new proxy-related error/status messages. - **chore(android)**: Removed `REQUEST_DELETE_PACKAGES` permission from `AndroidManifest.xml`. - **chore**: Deleted `feature/settings/CLAUDE.md`.
1 parent 8a7e5ca commit 5362bc9

26 files changed

Lines changed: 147 additions & 367 deletions

File tree

composeApp/src/androidMain/AndroidManifest.xml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
<uses-permission
1212
android:name="android.permission.REQUEST_INSTALL_PACKAGES"
1313
tools:ignore="RequestInstallPackagesPolicy" />
14-
<uses-permission android:name="android.permission.REQUEST_DELETE_PACKAGES" />
1514

1615
<application
1716
android:name=".app.GithubStoreApp"

core/data/src/androidMain/kotlin/zed/rainxch/core/data/services/AndroidInstaller.kt

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -180,20 +180,6 @@ class AndroidInstaller(
180180
}
181181
}
182182

183-
override fun uninstall(packageName: String) {
184-
Logger.d { "Requesting uninstall for: $packageName" }
185-
val intent = Intent(Intent.ACTION_DELETE).apply {
186-
data = "package:$packageName".toUri()
187-
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
188-
}
189-
try {
190-
context.startActivity(intent)
191-
} catch (e: Exception) {
192-
Logger.w { "Failed to start uninstall for $packageName: ${e.message}" }
193-
}
194-
195-
}
196-
197183
override fun openApp(packageName: String): Boolean {
198184
val launchIntent = context.packageManager.getLaunchIntentForPackage(packageName)
199185
return if (launchIntent != null) {

core/data/src/commonMain/kotlin/zed/rainxch/core/data/di/SharedModule.kt

Lines changed: 25 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import kotlinx.coroutines.Dispatchers
66
import kotlinx.coroutines.SupervisorJob
77
import kotlinx.coroutines.flow.first
88
import kotlinx.coroutines.runBlocking
9+
import kotlinx.coroutines.withTimeout
910
import org.koin.dsl.module
1011
import zed.rainxch.core.data.data_source.TokenStore
1112
import zed.rainxch.core.data.data_source.impl.DefaultTokenStore
@@ -107,27 +108,30 @@ val coreModule = module {
107108

108109
val networkModule = module {
109110
single<GitHubClientProvider> {
110-
// Load saved proxy config SYNCHRONOUSLY before creating the client provider
111-
// so the very first HTTP client uses the correct proxy. This is critical for
112-
// users in regions where direct GitHub access is blocked (e.g. China).
113-
runBlocking {
114-
val config = get<ProxyRepository>().getProxyConfig().first()
115-
when (config) {
116-
is ProxyConfig.None -> ProxyManager.setNoProxy()
117-
is ProxyConfig.System -> ProxyManager.setSystemProxy()
118-
is ProxyConfig.Http -> ProxyManager.setHttpProxy(
119-
host = config.host,
120-
port = config.port,
121-
username = config.username,
122-
password = config.password
123-
)
124-
is ProxyConfig.Socks -> ProxyManager.setSocksProxy(
125-
host = config.host,
126-
port = config.port,
127-
username = config.username,
128-
password = config.password
129-
)
130-
}
111+
val config = runBlocking {
112+
runCatching {
113+
withTimeout(1_500L) {
114+
get<ProxyRepository>().getProxyConfig().first()
115+
}
116+
}.getOrDefault(ProxyConfig.None)
117+
}
118+
119+
when (config) {
120+
is ProxyConfig.None -> ProxyManager.setNoProxy()
121+
is ProxyConfig.System -> ProxyManager.setSystemProxy()
122+
is ProxyConfig.Http -> ProxyManager.setHttpProxy(
123+
host = config.host,
124+
port = config.port,
125+
username = config.username,
126+
password = config.password
127+
)
128+
129+
is ProxyConfig.Socks -> ProxyManager.setSocksProxy(
130+
host = config.host,
131+
port = config.port,
132+
username = config.username,
133+
password = config.password
134+
)
131135
}
132136

133137
GitHubClientProvider(

core/data/src/jvmMain/kotlin/zed/rainxch/core/data/services/DesktopInstaller.kt

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -56,11 +56,6 @@ class DesktopInstaller(
5656

5757
}
5858

59-
override fun uninstall(packageName: String) {
60-
// Desktop doesn't have a unified uninstall mechanism
61-
Logger.d { "Uninstall not supported on desktop for: $packageName" }
62-
}
63-
6459
override fun openApp(packageName: String): Boolean {
6560
// Desktop apps are launched differently per platform
6661
Logger.d { "Open app not supported on desktop for: $packageName" }

core/domain/src/commonMain/kotlin/zed/rainxch/core/domain/system/Installer.kt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,5 @@ interface Installer {
2828

2929
fun getApkInfoExtractor(): InstallerInfoExtractor
3030

31-
fun uninstall(packageName: String)
32-
3331
fun openApp(packageName: String): Boolean
3432
}

core/presentation/src/commonMain/composeResources/values-bn/strings-bn.xml

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -350,15 +350,11 @@
350350
<!-- Install status -->
351351
<string name="pending_install">ইনস্টল মুলতুবি</string>
352352

353-
<!-- Uninstall / Open -->
354-
<string name="uninstall">আনইনস্টল</string>
353+
<!-- Open -->
355354
<string name="open_app">খুলুন</string>
356-
<string name="downgrade_requires_uninstall">ডাউনগ্রেডের জন্য আনইনস্টল প্রয়োজন</string>
357-
<string name="downgrade_warning_message">সংস্করণ %1$s ইনস্টল করতে বর্তমান সংস্করণ (%2$s) প্রথমে আনইনস্টল করতে হবে। অ্যাপের ডেটা মুছে যাবে।</string>
358-
<string name="uninstall_first">প্রথমে আনইনস্টল করুন</string>
355+
<string name="downgrade_warning_message">সংস্করণ %1$s ইনস্টল করা যাচ্ছে না কারণ একটি নতুন সংস্করণ (%2$s) ইতিমধ্যে ইনস্টল করা আছে। অনুগ্রহ করে প্রথমে বর্তমান সংস্করণটি ম্যানুয়ালি আনইনস্টল করুন।</string>
359356
<string name="install_version">%1$s ইনস্টল করুন</string>
360357
<string name="failed_to_open_app">%1$s খুলতে ব্যর্থ</string>
361-
<string name="failed_to_uninstall">%1$s আনইনস্টল করতে ব্যর্থ</string>
362358

363359
<!-- Version picker -->
364360
<string name="latest_badge">সর্বশেষ</string>
@@ -386,5 +382,10 @@
386382
<string name="proxy_system_description">আপনার ডিভাইসের প্রক্সি সেটিংস ব্যবহার করে</string>
387383
<string name="proxy_port_error">পোর্ট ১–৬৫৫৩৫ এর মধ্যে হতে হবে</string>
388384
<string name="proxy_none_description">সরাসরি সংযোগ, কোনো প্রক্সি নেই</string>
385+
<string name="failed_to_save_proxy_settings">প্রক্সি সেটিংস সংরক্ষণ করতে ব্যর্থ হয়েছে</string>
386+
<string name="proxy_host_required">প্রক্সি হোস্ট প্রয়োজন</string>
387+
<string name="invalid_proxy_port">অবৈধ প্রক্সি পোর্ট</string>
388+
<string name="proxy_show_password">পাসওয়ার্ড দেখান</string>
389+
<string name="proxy_hide_password">পাসওয়ার্ড লুকান</string>
389390

390391
</resources>

core/presentation/src/commonMain/composeResources/values-es/strings-es.xml

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -315,15 +315,11 @@
315315
<string name="inspect_with_appmanager">Inspeccionar con AppManager</string>
316316
<string name="appmanager_description">Verificar permisos, rastreadores y seguridad</string>
317317

318-
<!-- Uninstall / Open -->
319-
<string name="uninstall">Desinstalar</string>
318+
<!-- Open -->
320319
<string name="open_app">Abrir</string>
321-
<string name="downgrade_requires_uninstall">La degradación requiere desinstalar</string>
322-
<string name="downgrade_warning_message">Instalar la versión %1$s requiere desinstalar la versión actual (%2$s) primero. Los datos de la app se perderán.</string>
323-
<string name="uninstall_first">Desinstalar primero</string>
320+
<string name="downgrade_warning_message">No se puede instalar la versión %1$s porque ya hay una versión más reciente (%2$s) instalada. Por favor, desinstala la versión actual manualmente primero.</string>
324321
<string name="install_version">Instalar %1$s</string>
325322
<string name="failed_to_open_app">Error al abrir %1$s</string>
326-
<string name="failed_to_uninstall">Error al desinstalar %1$s</string>
327323

328324
<!-- Version picker -->
329325
<string name="latest_badge">Última</string>
@@ -346,10 +342,15 @@
346342
<string name="proxy_port">Puerto</string>
347343
<string name="proxy_username">Nombre de usuario (opcional)</string>
348344
<string name="proxy_password">Contraseña (opcional)</string>
349-
<string name="proxy_save">Guardar Proxy</string>
345+
<string name="proxy_save">Guardar proxy</string>
350346
<string name="proxy_saved">Configuración de proxy guardada</string>
351-
<string name="proxy_system_description">Usa la configuración proxy del dispositivo</string>
347+
<string name="proxy_system_description">Usa la configuración de proxy del dispositivo</string>
352348
<string name="proxy_port_error">El puerto debe ser 1–65535</string>
353349
<string name="proxy_none_description">Conexión directa, sin proxy</string>
350+
<string name="failed_to_save_proxy_settings">No se pudieron guardar los ajustes del proxy</string>
351+
<string name="proxy_host_required">Se requiere el host del proxy</string>
352+
<string name="invalid_proxy_port">Puerto de proxy no válido</string>
353+
<string name="proxy_show_password">Mostrar contraseña</string>
354+
<string name="proxy_hide_password">Ocultar contraseña</string>
354355

355356
</resources>

core/presentation/src/commonMain/composeResources/values-fr/strings-fr.xml

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -315,15 +315,11 @@
315315
<string name="inspect_with_appmanager">Inspecter avec AppManager</string>
316316
<string name="appmanager_description">Vérifier les permissions, trackers et sécurité</string>
317317

318-
<!-- Uninstall / Open -->
319-
<string name="uninstall">Désinstaller</string>
318+
<!-- Open -->
320319
<string name="open_app">Ouvrir</string>
321-
<string name="downgrade_requires_uninstall">La rétrogradation nécessite la désinstallation</string>
322-
<string name="downgrade_warning_message">L\'installation de la version %1$s nécessite la désinstallation de la version actuelle (%2$s). Les données de l\'application seront perdues.</string>
323-
<string name="uninstall_first">Désinstaller d\'abord</string>
320+
<string name="downgrade_warning_message">Impossible d\'installer la version %1$s car une version plus récente (%2$s) est déjà installée. Veuillez d\'abord désinstaller manuellement la version actuelle.</string>
324321
<string name="install_version">Installer %1$s</string>
325322
<string name="failed_to_open_app">Impossible d\'ouvrir %1$s</string>
326-
<string name="failed_to_uninstall">Impossible de désinstaller %1$s</string>
327323

328324
<!-- Version picker -->
329325
<string name="latest_badge">Dernière</string>
@@ -351,5 +347,10 @@
351347
<string name="proxy_system_description">Utilise les paramètres proxy de l\'appareil</string>
352348
<string name="proxy_port_error">Le port doit être entre 1 et 65535</string>
353349
<string name="proxy_none_description">Connexion directe, pas de proxy</string>
350+
<string name="failed_to_save_proxy_settings">Échec de l'enregistrement des paramètres du proxy</string>
351+
<string name="proxy_host_required">L’hôte du proxy est requis</string>
352+
<string name="invalid_proxy_port">Port proxy invalide</string>
353+
<string name="proxy_show_password">Afficher le mot de passe</string>
354+
<string name="proxy_hide_password">Masquer le mot de passe</string>
354355

355356
</resources>

core/presentation/src/commonMain/composeResources/values-hi/strings-hi.xml

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -350,15 +350,11 @@
350350
<!-- Install status -->
351351
<string name="pending_install">इंस्टॉल लंबित</string>
352352

353-
<!-- Uninstall / Open -->
354-
<string name="uninstall">अनइंस्टॉल</string>
353+
<!-- Open -->
355354
<string name="open_app">खोलें</string>
356-
<string name="downgrade_requires_uninstall">डाउनग्रेड के लिए अनइंस्टॉल आवश्यक</string>
357-
<string name="downgrade_warning_message">संस्करण %1$s इंस्टॉल करने के लिए पहले वर्तमान संस्करण (%2$s) को अनइंस्टॉल करना होगा। ऐप डेटा खो जाएगा।</string>
358-
<string name="uninstall_first">पहले अनइंस्टॉल करें</string>
355+
<string name="downgrade_warning_message">संस्करण %1$s इंस्टॉल नहीं किया जा सकता क्योंकि एक नया संस्करण (%2$s) पहले से इंस्टॉल है। कृपया पहले वर्तमान संस्करण को मैन्युअल रूप से अनइंस्टॉल करें।</string>
359356
<string name="install_version">%1$s इंस्टॉल करें</string>
360357
<string name="failed_to_open_app">%1$s खोलने में विफल</string>
361-
<string name="failed_to_uninstall">%1$s अनइंस्टॉल करने में विफल</string>
362358

363359
<!-- Version picker -->
364360
<string name="latest_badge">नवीनतम</string>
@@ -386,4 +382,10 @@
386382
<string name="proxy_system_description">आपके डिवाइस की प्रॉक्सी सेटिंग का उपयोग करता है</string>
387383
<string name="proxy_port_error">पोर्ट 1–65535 के बीच होना चाहिए</string>
388384
<string name="proxy_none_description">सीधा कनेक्शन, कोई प्रॉक्सी नहीं</string>
385+
<string name="failed_to_save_proxy_settings">प्रॉक्सी सेटिंग्स सहेजने में विफल</string>
386+
<string name="proxy_host_required">प्रॉक्सी होस्ट आवश्यक है</string>
387+
<string name="invalid_proxy_port">अमान्य प्रॉक्सी पोर्ट</string>
388+
<string name="proxy_show_password">पासवर्ड दिखाएँ</string>
389+
<string name="proxy_hide_password">पासवर्ड छुपाएँ</string>
390+
389391
</resources>

core/presentation/src/commonMain/composeResources/values-it/strings-it.xml

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -346,15 +346,11 @@
346346
<!-- Install status -->
347347
<string name="pending_install">Installazione in sospeso</string>
348348

349-
<!-- Uninstall / Open -->
350-
<string name="uninstall">Disinstalla</string>
349+
<!-- Open -->
351350
<string name="open_app">Apri</string>
352-
<string name="downgrade_requires_uninstall">Il downgrade richiede la disinstallazione</string>
353-
<string name="downgrade_warning_message">L\'installazione della versione %1$s richiede la disinstallazione della versione corrente (%2$s). I dati dell\'app verranno persi.</string>
354-
<string name="uninstall_first">Disinstalla prima</string>
351+
<string name="downgrade_warning_message">Impossibile installare la versione %1$s perché una versione più recente (%2$s) è già installata. Disinstalla manualmente la versione corrente prima di procedere.</string>
355352
<string name="install_version">Installa %1$s</string>
356353
<string name="failed_to_open_app">Impossibile aprire %1$s</string>
357-
<string name="failed_to_uninstall">Impossibile disinstallare %1$s</string>
358354

359355
<!-- Version picker -->
360356
<string name="latest_badge">Ultima</string>
@@ -387,5 +383,10 @@
387383
<string name="proxy_system_description">Usa le impostazioni proxy del dispositivo</string>
388384
<string name="proxy_port_error">La porta deve essere 1–65535</string>
389385
<string name="proxy_none_description">Connessione diretta, nessun proxy</string>
386+
<string name="failed_to_save_proxy_settings">Impossibile salvare le impostazioni del proxy</string>
387+
<string name="proxy_host_required">L'host del proxy è obbligatorio</string>
388+
<string name="invalid_proxy_port">Porta proxy non valida</string>
389+
<string name="proxy_show_password">Mostra password</string>
390+
<string name="proxy_hide_password">Nascondi password</string>
390391

391392
</resources>

0 commit comments

Comments
 (0)