From 377b57f985013960d9eee324fc28ce02430c16fe Mon Sep 17 00:00:00 2001 From: Chirayu Desai Date: Thu, 23 Mar 2017 18:37:53 +0530 Subject: [PATCH] Set installer package name to privext if using that * The new PackageInstaller APIs, being used by the privext on Android 7.0 and above aren't happy with uninstall being done by an app other than the original installer. * Set it to the privileged extension if that is enabled and being used, to make uninstalling work closes !457 --- .../fdroid/compat/PackageManagerCompat.java | 16 ++++++++++++++-- .../fdroid/installer/InstallManagerService.java | 6 ++++-- .../fdroid/installer/PrivilegedInstaller.java | 5 +++++ 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/org/fdroid/fdroid/compat/PackageManagerCompat.java b/app/src/main/java/org/fdroid/fdroid/compat/PackageManagerCompat.java index cf20feb14..0daf49d6b 100644 --- a/app/src/main/java/org/fdroid/fdroid/compat/PackageManagerCompat.java +++ b/app/src/main/java/org/fdroid/fdroid/compat/PackageManagerCompat.java @@ -1,10 +1,12 @@ package org.fdroid.fdroid.compat; import android.annotation.TargetApi; +import android.content.Context; import android.content.pm.PackageManager; import android.os.Build; import android.util.Log; +import org.fdroid.fdroid.installer.PrivilegedInstaller; import org.fdroid.fdroid.Utils; public class PackageManagerCompat { @@ -12,10 +14,20 @@ public class PackageManagerCompat { private static final String TAG = "PackageManagerCompat"; @TargetApi(11) - public static void setInstaller(PackageManager mPm, String packageName) { + public static void setInstaller(Context context, PackageManager mPm, String packageName) { if (Build.VERSION.SDK_INT < 11) return; try { - mPm.setInstallerPackageName(packageName, "org.fdroid.fdroid"); + /* + * Starting with 7.0 (API 24), we're using PackageInstaller APIs + * to install and uninstall apps via the privileged extension. + * That enforces the uninstaller being the same as the installer, + * so set the package name to that. + */ + if (Build.VERSION.SDK_INT >= 24 && PrivilegedInstaller.isDefault(context)) { + mPm.setInstallerPackageName(packageName, "org.fdroid.fdroid.privileged"); + } else { + mPm.setInstallerPackageName(packageName, "org.fdroid.fdroid"); + } Utils.debugLog(TAG, "Installer package name for " + packageName + " set successfully"); } catch (Exception e) { // Many problems can occur: diff --git a/app/src/main/java/org/fdroid/fdroid/installer/InstallManagerService.java b/app/src/main/java/org/fdroid/fdroid/installer/InstallManagerService.java index 0d1377e44..cefda3513 100644 --- a/app/src/main/java/org/fdroid/fdroid/installer/InstallManagerService.java +++ b/app/src/main/java/org/fdroid/fdroid/installer/InstallManagerService.java @@ -334,8 +334,10 @@ public class InstallManagerService extends Service { case Installer.ACTION_INSTALL_COMPLETE: Apk apkComplete = removeFromActive(downloadUrl); - PackageManagerCompat.setInstaller(getPackageManager(), apkComplete.packageName); - if (PrivilegedInstaller.isDefault(context)) cancelNotification(downloadUrl); + PackageManagerCompat.setInstaller(context, getPackageManager(), apkComplete.packageName); + if (PrivilegedInstaller.isDefault(context)) { + cancelNotification(downloadUrl); + } localBroadcastManager.unregisterReceiver(this); break; diff --git a/app/src/main/java/org/fdroid/fdroid/installer/PrivilegedInstaller.java b/app/src/main/java/org/fdroid/fdroid/installer/PrivilegedInstaller.java index 95b23c235..e0e9a8623 100644 --- a/app/src/main/java/org/fdroid/fdroid/installer/PrivilegedInstaller.java +++ b/app/src/main/java/org/fdroid/fdroid/installer/PrivilegedInstaller.java @@ -34,6 +34,7 @@ import android.util.Log; import org.fdroid.fdroid.Preferences; import org.fdroid.fdroid.R; +import org.fdroid.fdroid.compat.PackageManagerCompat; import org.fdroid.fdroid.data.Apk; import org.fdroid.fdroid.privileged.IPrivilegedCallback; import org.fdroid.fdroid.privileged.IPrivilegedService; @@ -394,6 +395,10 @@ public class PrivilegedInstaller extends Installer { } }; + /* + * Set installer to the privileged extension + */ + PackageManagerCompat.setInstaller(context, context.getPackageManager(), apk.packageName); Intent serviceIntent = new Intent(PRIVILEGED_EXTENSION_SERVICE_INTENT); serviceIntent.setPackage(PRIVILEGED_EXTENSION_PACKAGE_NAME); context.getApplicationContext().bindService(serviceIntent, mServiceConnection,