From 5523a443f8c6deaf291861f9e44c66187b8553ba Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Thu, 9 Jun 2016 16:06:48 +0200 Subject: [PATCH 1/2] never have null Apks in InstallManagerService In order to avoid having null guards making the code ugly, use a "blank" instance of Apk which will work for the various comparisons. This fixes this crash: fixes #688 java.lang.NullPointerException at org.fdroid.fdroid.installer.InstallManagerService$4.onReceive(InstallManagerService.java:243) at android.support.v4.content.LocalBroadcastManager.executePendingBroadcasts(LocalBroadcastManager.java:297) at android.support.v4.content.LocalBroadcastManager.access$000(LocalBroadcastManager.java:46) at android.support.v4.content.LocalBroadcastManager$1.handleMessage(LocalBroadcastManager.java:116) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:136) at android.app.ActivityThread.main(ActivityThread.java:5001) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) at dalvik.system.NativeStart.main(Native Method) --- .../fdroid/fdroid/installer/InstallManagerService.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) 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 1486b0215..971ed732d 100644 --- a/app/src/main/java/org/fdroid/fdroid/installer/InstallManagerService.java +++ b/app/src/main/java/org/fdroid/fdroid/installer/InstallManagerService.java @@ -459,11 +459,17 @@ public class InstallManagerService extends Service { return ACTIVE_APPS.get(getApkFromActive(urlString).packageName); } + /** + * Remove the URL from this service, and return the {@link Apk}. This returns + * an empty {@code Apk} instance if we get a null one so the code doesn't need + * lots of null guards. + */ private static Apk removeFromActive(String urlString) { Apk apk = ACTIVE_APKS.remove(urlString); - if (apk != null) { - ACTIVE_APPS.remove(apk.packageName); + if (apk == null) { + return new Apk(); } + ACTIVE_APPS.remove(apk.packageName); return apk; } From 89e2c9948a93497b50c3fa9de9c4269595e10277 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Fri, 10 Jun 2016 10:46:06 +0200 Subject: [PATCH 2/2] fix off-by-one error in update check for db-version/56 We missed an off-by-one in my previous DB change: 90467bf8bf2f8e4a46cb1db563154df4035bf746 This causes the installed app parsing to happen on each start when on any build that is on db-version/56. Its not a big deal since the broken code was not shipped at all, even in an alpha. --- app/src/main/java/org/fdroid/fdroid/data/DBHelper.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/fdroid/fdroid/data/DBHelper.java b/app/src/main/java/org/fdroid/fdroid/data/DBHelper.java index 4d702dcf8..209905a27 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/DBHelper.java +++ b/app/src/main/java/org/fdroid/fdroid/data/DBHelper.java @@ -566,7 +566,7 @@ class DBHelper extends SQLiteOpenHelper { * table for the first time. */ private void recreateInstalledAppTable(SQLiteDatabase db, int oldVersion) { - if (oldVersion >= 57) { + if (oldVersion >= 56) { return; } Utils.debugLog(TAG, "(re)creating 'installed app' database table.");