From f0d6acd974548e24662a64271ae57922f74c3225 Mon Sep 17 00:00:00 2001
From: Hans-Christoph Steiner <hans@eds.org>
Date: Tue, 20 Sep 2016 11:47:49 +0200
Subject: [PATCH] send Installer.ACTION_INSTALL_STARTED consistently

ACTION_INSTALL_STARTED was being sent twice per transaction with the
default installer. Also, it should be sent as the first step of the install
process.
---
 .../fdroid/installer/DefaultInstaller.java      |  9 ++-------
 .../installer/DefaultInstallerActivity.java     |  4 ++--
 .../fdroid/installer/InstallManagerService.java |  5 ++++-
 .../org/fdroid/fdroid/installer/Installer.java  | 17 ++++++++---------
 .../fdroid/installer/PrivilegedInstaller.java   |  2 --
 5 files changed, 16 insertions(+), 21 deletions(-)

diff --git a/app/src/main/java/org/fdroid/fdroid/installer/DefaultInstaller.java b/app/src/main/java/org/fdroid/fdroid/installer/DefaultInstaller.java
index fa202dda5..6fba6ec6a 100644
--- a/app/src/main/java/org/fdroid/fdroid/installer/DefaultInstaller.java
+++ b/app/src/main/java/org/fdroid/fdroid/installer/DefaultInstaller.java
@@ -1,5 +1,6 @@
 /*
  * Copyright (C) 2016 Dominik Schürmann <dominik@dominikschuermann.de>
+ * Copyright (C) 2016 Blue Jay Wireless
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -25,11 +26,8 @@ import android.content.Intent;
 import android.net.Uri;
 import android.os.Build;
 
-import org.fdroid.fdroid.Utils;
 import org.fdroid.fdroid.data.Apk;
 
-import java.io.File;
-
 /**
  * The default installer of F-Droid. It uses the normal Intents APIs of Android
  * to install apks. Its main inner workings are encapsulated in DefaultInstallerActivity.
@@ -39,7 +37,7 @@ import java.io.File;
  */
 public class DefaultInstaller extends Installer {
 
-    private static final String TAG = "DefaultInstaller";
+    public static final String TAG = "DefaultInstaller";
 
     DefaultInstaller(Context context, Apk apk) {
         super(context, apk);
@@ -47,9 +45,6 @@ public class DefaultInstaller extends Installer {
 
     @Override
     protected void installPackageInternal(Uri localApkUri, Uri downloadUri, Apk apk) {
-        sendBroadcastInstall(downloadUri, Installer.ACTION_INSTALL_STARTED);
-
-        Utils.debugLog(TAG, "DefaultInstaller uri: " + localApkUri + " file: " + new File(localApkUri.getPath()));
 
         Intent installIntent = new Intent(context, DefaultInstallerActivity.class);
         installIntent.setAction(DefaultInstallerActivity.ACTION_INSTALL_PACKAGE);
diff --git a/app/src/main/java/org/fdroid/fdroid/installer/DefaultInstallerActivity.java b/app/src/main/java/org/fdroid/fdroid/installer/DefaultInstallerActivity.java
index 04efb2087..9c53800f2 100644
--- a/app/src/main/java/org/fdroid/fdroid/installer/DefaultInstallerActivity.java
+++ b/app/src/main/java/org/fdroid/fdroid/installer/DefaultInstallerActivity.java
@@ -1,5 +1,6 @@
 /*
  * Copyright (C) 2014-2016 Dominik Schürmann <dominik@dominikschuermann.de>
+ * Copyright (C) 2016 Blue Jay Wireless
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -37,7 +38,7 @@ import org.fdroid.fdroid.data.Apk;
  * A transparent activity as a wrapper around Android's PackageInstaller Intents
  */
 public class DefaultInstallerActivity extends FragmentActivity {
-    private static final String TAG = "AndroidInstallerAct";
+    private static final String TAG = "DefaultInstallerActivit";
 
     static final String ACTION_INSTALL_PACKAGE = "org.fdroid.fdroid.installer.DefaultInstaller.action.INSTALL_PACKAGE";
     static final String ACTION_UNINSTALL_PACKAGE = "org.fdroid.fdroid.installer.DefaultInstaller.action.UNINSTALL_PACKAGE";
@@ -121,7 +122,6 @@ public class DefaultInstallerActivity extends FragmentActivity {
                     "This Android rom does not support ACTION_INSTALL_PACKAGE!");
             finish();
         }
-        installer.sendBroadcastInstall(downloadUri, Installer.ACTION_INSTALL_STARTED);
     }
 
     private void uninstallPackage(String packageName) {
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 62b1b0d88..2e3564507 100644
--- a/app/src/main/java/org/fdroid/fdroid/installer/InstallManagerService.java
+++ b/app/src/main/java/org/fdroid/fdroid/installer/InstallManagerService.java
@@ -462,10 +462,13 @@ public class InstallManagerService extends Service {
      */
     public static void queue(Context context, App app, Apk apk) {
         String urlString = apk.getUrl();
+        Uri downloadUri = Uri.parse(urlString);
+        Installer.sendBroadcastInstall(context, downloadUri, Installer.ACTION_INSTALL_STARTED, apk,
+                null, null);
         Utils.debugLog(TAG, "queue " + app.packageName + " " + apk.versionCode + " from " + urlString);
         Intent intent = new Intent(context, InstallManagerService.class);
         intent.setAction(ACTION_INSTALL);
-        intent.setData(Uri.parse(urlString));
+        intent.setData(downloadUri);
         intent.putExtra(EXTRA_APP, app);
         intent.putExtra(EXTRA_APK, apk);
         context.startService(intent);
diff --git a/app/src/main/java/org/fdroid/fdroid/installer/Installer.java b/app/src/main/java/org/fdroid/fdroid/installer/Installer.java
index bdcf2a271..ffa50fe41 100644
--- a/app/src/main/java/org/fdroid/fdroid/installer/Installer.java
+++ b/app/src/main/java/org/fdroid/fdroid/installer/Installer.java
@@ -47,7 +47,6 @@ public abstract class Installer {
 
     final Context context;
     final Apk apk;
-    private final LocalBroadcastManager localBroadcastManager;
 
     public static final String ACTION_INSTALL_STARTED = "org.fdroid.fdroid.installer.Installer.action.INSTALL_STARTED";
     public static final String ACTION_INSTALL_COMPLETE = "org.fdroid.fdroid.installer.Installer.action.INSTALL_COMPLETE";
@@ -79,7 +78,6 @@ public abstract class Installer {
     Installer(Context context, Apk apk) {
         this.context = context;
         this.apk = apk;
-        localBroadcastManager = LocalBroadcastManager.getInstance(context);
     }
 
     /**
@@ -148,19 +146,20 @@ public abstract class Installer {
     }
 
     void sendBroadcastInstall(Uri downloadUri, String action, PendingIntent pendingIntent) {
-        sendBroadcastInstall(downloadUri, action, pendingIntent, null);
+        sendBroadcastInstall(context, downloadUri, action, apk, pendingIntent, null);
     }
 
     void sendBroadcastInstall(Uri downloadUri, String action) {
-        sendBroadcastInstall(downloadUri, action, null, null);
+        sendBroadcastInstall(context, downloadUri, action, apk, null, null);
     }
 
     void sendBroadcastInstall(Uri downloadUri, String action, String errorMessage) {
-        sendBroadcastInstall(downloadUri, action, null, errorMessage);
+        sendBroadcastInstall(context, downloadUri, action, apk, null, errorMessage);
     }
 
-    void sendBroadcastInstall(Uri downloadUri, String action,
-                              PendingIntent pendingIntent, String errorMessage) {
+    static void sendBroadcastInstall(Context context,
+                                     Uri downloadUri, String action, Apk apk,
+                                     PendingIntent pendingIntent, String errorMessage) {
         Intent intent = new Intent(action);
         intent.setData(downloadUri);
         intent.putExtra(Installer.EXTRA_USER_INTERACTION_PI, pendingIntent);
@@ -168,7 +167,7 @@ public abstract class Installer {
         if (!TextUtils.isEmpty(errorMessage)) {
             intent.putExtra(Installer.EXTRA_ERROR_MESSAGE, errorMessage);
         }
-        localBroadcastManager.sendBroadcast(intent);
+        LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
     }
 
     void sendBroadcastUninstall(String action, String errorMessage) {
@@ -193,7 +192,7 @@ public abstract class Installer {
         if (!TextUtils.isEmpty(errorMessage)) {
             intent.putExtra(Installer.EXTRA_ERROR_MESSAGE, errorMessage);
         }
-        localBroadcastManager.sendBroadcast(intent);
+        LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
     }
 
     /**
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 c1f7ac64a..11c6f984e 100644
--- a/app/src/main/java/org/fdroid/fdroid/installer/PrivilegedInstaller.java
+++ b/app/src/main/java/org/fdroid/fdroid/installer/PrivilegedInstaller.java
@@ -308,8 +308,6 @@ public class PrivilegedInstaller extends Installer {
 
     @Override
     protected void installPackageInternal(final Uri localApkUri, final Uri downloadUri, Apk apk) {
-        sendBroadcastInstall(downloadUri, Installer.ACTION_INSTALL_STARTED);
-
         ServiceConnection mServiceConnection = new ServiceConnection() {
             public void onServiceConnected(ComponentName name, IBinder service) {
                 IPrivilegedService privService = IPrivilegedService.Stub.asInterface(service);