From 30d3f8efccbc828e0684730d8fe1f886af458922 Mon Sep 17 00:00:00 2001
From: Peter Serwylo <peter@serwylo.com>
Date: Fri, 24 Feb 2017 11:42:15 +1100
Subject: [PATCH] Make "batchUpdates" mode an implementation detail of the
 `AddUpdateStatusManager` class.

Because of the way that this can be misused without the compiler knowing
(e.g. by forgetting to call `endBatchUpdates()`) it may be safer to move
it to an internal implementation detail of the class.

It could probably be done away with completely if the `notify*` methods
were moved out of the respective `*ApkInternal()` methods, but that
requires more significant refactoring to get right without code
duplication.
---
 .../org/fdroid/fdroid/AppUpdateStatusManager.java  | 14 ++++++++++++--
 .../main/java/org/fdroid/fdroid/UpdateService.java |  7 +++----
 2 files changed, 15 insertions(+), 6 deletions(-)

diff --git a/app/src/main/java/org/fdroid/fdroid/AppUpdateStatusManager.java b/app/src/main/java/org/fdroid/fdroid/AppUpdateStatusManager.java
index 90f00c7ad..545abf37f 100644
--- a/app/src/main/java/org/fdroid/fdroid/AppUpdateStatusManager.java
+++ b/app/src/main/java/org/fdroid/fdroid/AppUpdateStatusManager.java
@@ -19,6 +19,7 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.Iterator;
+import java.util.List;
 import java.util.Map;
 
 public class AppUpdateStatusManager {
@@ -187,6 +188,15 @@ public class AppUpdateStatusManager {
         }
     }
 
+
+    public void addApks(List<Apk> apksToUpdate, Status status) {
+        startBatchUpdates();
+        for (Apk apk : apksToUpdate) {
+            addApk(apk, status, null);
+        }
+        endBatchUpdates();
+    }
+
     /**
      * Add an Apk to the AppUpdateStatusManager manager.
      * @param apk The apk to add.
@@ -250,13 +260,13 @@ public class AppUpdateStatusManager {
         }
     }
 
-    void startBatchUpdates() {
+    private void startBatchUpdates() {
         synchronized (appMapping) {
             isBatchUpdating = true;
         }
     }
 
-    void endBatchUpdates() {
+    private void endBatchUpdates() {
         synchronized (appMapping) {
             isBatchUpdating = false;
             notifyChange();
diff --git a/app/src/main/java/org/fdroid/fdroid/UpdateService.java b/app/src/main/java/org/fdroid/fdroid/UpdateService.java
index 11a11cf4f..58b3ce6d4 100644
--- a/app/src/main/java/org/fdroid/fdroid/UpdateService.java
+++ b/app/src/main/java/org/fdroid/fdroid/UpdateService.java
@@ -489,14 +489,13 @@ public class UpdateService extends IntentService {
     private void showAppUpdatesNotification(Cursor hasUpdates) {
         if (hasUpdates != null) {
             hasUpdates.moveToFirst();
-            appUpdateStatusManager.startBatchUpdates();
+            List<Apk> apksToUpdate = new ArrayList<>(hasUpdates.getCount());
             for (int i = 0; i < hasUpdates.getCount(); i++) {
                 App app = new App(hasUpdates);
                 hasUpdates.moveToNext();
-                Apk apk = ApkProvider.Helper.findApkFromAnyRepo(this, app.packageName, app.suggestedVersionCode);
-                appUpdateStatusManager.addApk(apk, AppUpdateStatusManager.Status.UpdateAvailable, null);
+                apksToUpdate.add(ApkProvider.Helper.findApkFromAnyRepo(this, app.packageName, app.suggestedVersionCode));
             }
-            appUpdateStatusManager.endBatchUpdates();
+            appUpdateStatusManager.addApks(apksToUpdate, AppUpdateStatusManager.Status.UpdateAvailable);
         }
     }