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..137fd9ee8 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 (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 7a80f3fc5..e36d21f4c 100644 --- a/app/src/main/java/org/fdroid/fdroid/installer/InstallManagerService.java +++ b/app/src/main/java/org/fdroid/fdroid/installer/InstallManagerService.java @@ -336,8 +336,9 @@ public class InstallManagerService extends Service { case Installer.ACTION_INSTALL_COMPLETE: appUpdateStatusManager.updateApk(downloadUrl, AppUpdateStatusManager.Status.Installed, null); Apk apkComplete = appUpdateStatusManager.getApk(downloadUrl); + if (apkComplete != null) { - PackageManagerCompat.setInstaller(getPackageManager(), apkComplete.packageName); + PackageManagerCompat.setInstaller(context, getPackageManager(), apkComplete.packageName); } 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,