From 7ac3ff293e3ed719bdde0c36ad938b386f117d60 Mon Sep 17 00:00:00 2001 From: Chirayu Desai Date: Tue, 18 Apr 2017 17:21:18 +0530 Subject: [PATCH] Don't allow uninstalling system apps. * F-Droid cannnot uninstall system apps, only their updates, but even with the privileged extension, that can get complicated. * Let's just not allow uninstalling system apps, the phone's settings app can happily disable/re-enable system apps, and also uninstalls their updates on disabling. --- .../main/java/org/fdroid/fdroid/data/App.java | 21 +++++++++++++++++++ .../fdroid/installer/InstallerFactory.java | 2 +- .../views/AppDetailsRecyclerViewAdapter.java | 2 +- 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/fdroid/fdroid/data/App.java b/app/src/main/java/org/fdroid/fdroid/data/App.java index 66d4009e9..ad189b7b0 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/App.java +++ b/app/src/main/java/org/fdroid/fdroid/data/App.java @@ -960,6 +960,27 @@ public class App extends ValueObject implements Comparable, Parcelable { return 0; } + /** + * System apps aren't uninstallable, only their updates are. + */ + public boolean isUninstallable(Context context) { + if (this.isInstalled()) { + PackageManager pm = context.getPackageManager(); + ApplicationInfo appInfo; + try { + appInfo = pm.getApplicationInfo(this.packageName, + PackageManager.GET_UNINSTALLED_PACKAGES); + } catch (PackageManager.NameNotFoundException e) { + return false; + } + + final boolean isSystem = (appInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0; + return !isSystem && this.isInstalled(); + } else { + return false; + } + } + @Override public void writeToParcel(Parcel dest, int flags) { dest.writeByte(this.compatible ? (byte) 1 : (byte) 0); diff --git a/app/src/main/java/org/fdroid/fdroid/installer/InstallerFactory.java b/app/src/main/java/org/fdroid/fdroid/installer/InstallerFactory.java index e00206d17..066cec1d3 100644 --- a/app/src/main/java/org/fdroid/fdroid/installer/InstallerFactory.java +++ b/app/src/main/java/org/fdroid/fdroid/installer/InstallerFactory.java @@ -47,7 +47,7 @@ public class InstallerFactory { Installer installer; - if (!apk.apkName.endsWith(".apk")) { + if (apk.apkName != null && !apk.apkName.endsWith(".apk")) { String msg = context.getString(R.string.install_error_not_yet_supported, apk.apkName); Toast.makeText(context, msg, Toast.LENGTH_LONG).show(); Utils.debugLog(TAG, msg); diff --git a/app/src/main/java/org/fdroid/fdroid/views/AppDetailsRecyclerViewAdapter.java b/app/src/main/java/org/fdroid/fdroid/views/AppDetailsRecyclerViewAdapter.java index d4061d835..26b758c21 100644 --- a/app/src/main/java/org/fdroid/fdroid/views/AppDetailsRecyclerViewAdapter.java +++ b/app/src/main/java/org/fdroid/fdroid/views/AppDetailsRecyclerViewAdapter.java @@ -469,7 +469,7 @@ public class AppDetailsRecyclerViewAdapter } updateAntiFeaturesWarning(); buttonSecondaryView.setText(R.string.menu_uninstall); - buttonSecondaryView.setVisibility(app.isInstalled() ? View.VISIBLE : View.INVISIBLE); + buttonSecondaryView.setVisibility(app.isUninstallable(context) ? View.VISIBLE : View.INVISIBLE); buttonSecondaryView.setOnClickListener(onUnInstallClickListener); buttonPrimaryView.setText(R.string.menu_install); buttonPrimaryView.setVisibility(versions.size() > 0 ? View.VISIBLE : View.GONE);