From 7a16bf4ce55ac7c3c856a3c2324c55a132af988f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Mart=C3=AD?= Date: Tue, 29 Apr 2014 18:18:38 +0200 Subject: [PATCH] Fix broadcast receiving of package updates * It is PACKAGE_REPLACED, not PACKAGE_CHANGED: http://developer.android.com/reference/android/content/Intent.html#ACTION_PACKAGE_CHANGED * REMOVED and then ADDED are fired as well as REPLACED when upgrading an application: http://stackoverflow.com/questions/5217237/package-removed-then-package-added-are-fired-along-with-package-replaced-inten --- AndroidManifest.xml | 2 +- src/org/fdroid/fdroid/PackageAddedReceiver.java | 12 +++++++++++- src/org/fdroid/fdroid/PackageReceiver.java | 4 ++++ src/org/fdroid/fdroid/PackageRemovedReceiver.java | 12 +++++++++++- src/org/fdroid/fdroid/PackageUpgradedReceiver.java | 8 +++++++- 5 files changed, 34 insertions(+), 4 deletions(-) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 30fdc3436..a6972fd34 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -291,7 +291,7 @@ - + diff --git a/src/org/fdroid/fdroid/PackageAddedReceiver.java b/src/org/fdroid/fdroid/PackageAddedReceiver.java index 5d218b00c..0f683e3ae 100644 --- a/src/org/fdroid/fdroid/PackageAddedReceiver.java +++ b/src/org/fdroid/fdroid/PackageAddedReceiver.java @@ -20,6 +20,7 @@ package org.fdroid.fdroid; import android.content.ContentValues; import android.content.Context; +import android.content.Intent; import android.content.pm.PackageInfo; import android.net.Uri; import android.util.Log; @@ -27,6 +28,15 @@ import org.fdroid.fdroid.data.InstalledAppProvider; public class PackageAddedReceiver extends PackageReceiver { + @Override + protected boolean toDiscard(Intent intent) { + if (intent.hasExtra(Intent.EXTRA_REPLACING)) { + Log.d("FDroid", "Discarding since this PACKAGE_ADDED is just a PACKAGE_REPLACED"); + return true; + } + return false; + } + @Override protected void handle(Context context, String appId) { PackageInfo info = getPackageInfo(context, appId); @@ -41,4 +51,4 @@ public class PackageAddedReceiver extends PackageReceiver { context.getContentResolver().insert(uri, values); } -} \ No newline at end of file +} diff --git a/src/org/fdroid/fdroid/PackageReceiver.java b/src/org/fdroid/fdroid/PackageReceiver.java index 00b85227f..3ddb4f273 100644 --- a/src/org/fdroid/fdroid/PackageReceiver.java +++ b/src/org/fdroid/fdroid/PackageReceiver.java @@ -29,6 +29,7 @@ import org.fdroid.fdroid.data.AppProvider; abstract class PackageReceiver extends BroadcastReceiver { + abstract protected boolean toDiscard(Intent intent); abstract protected void handle(Context context, String appId); protected PackageInfo getPackageInfo(Context context, String appId) { @@ -43,6 +44,9 @@ abstract class PackageReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Log.d("FDroid", "PackageReceiver received [action = '" + intent.getAction() + "', data = '" + intent.getData() + "']"); + if (toDiscard(intent)) { + return; + } String appId = intent.getData().getSchemeSpecificPart(); handle(context, appId); context.getContentResolver().notifyChange(AppProvider.getContentUri(appId), null); diff --git a/src/org/fdroid/fdroid/PackageRemovedReceiver.java b/src/org/fdroid/fdroid/PackageRemovedReceiver.java index 163a8278b..c9ad96869 100644 --- a/src/org/fdroid/fdroid/PackageRemovedReceiver.java +++ b/src/org/fdroid/fdroid/PackageRemovedReceiver.java @@ -19,6 +19,7 @@ package org.fdroid.fdroid; import android.content.Context; +import android.content.Intent; import android.net.Uri; import android.util.Log; import org.fdroid.fdroid.data.AppProvider; @@ -26,6 +27,15 @@ import org.fdroid.fdroid.data.InstalledAppProvider; public class PackageRemovedReceiver extends PackageReceiver { + @Override + protected boolean toDiscard(Intent intent) { + if (intent.hasExtra(Intent.EXTRA_REPLACING)) { + Log.d("FDroid", "Discarding since this PACKAGE_REMOVED is just a PACKAGE_REPLACED"); + return true; + } + return false; + } + @Override protected void handle(Context context, String appId) { @@ -35,4 +45,4 @@ public class PackageRemovedReceiver extends PackageReceiver { context.getContentResolver().delete(uri, null, null); } -} \ No newline at end of file +} diff --git a/src/org/fdroid/fdroid/PackageUpgradedReceiver.java b/src/org/fdroid/fdroid/PackageUpgradedReceiver.java index 404818881..6f4057dca 100644 --- a/src/org/fdroid/fdroid/PackageUpgradedReceiver.java +++ b/src/org/fdroid/fdroid/PackageUpgradedReceiver.java @@ -20,6 +20,7 @@ package org.fdroid.fdroid; import android.content.ContentValues; import android.content.Context; +import android.content.Intent; import android.content.pm.PackageInfo; import android.net.Uri; import android.util.Log; @@ -33,6 +34,11 @@ import org.fdroid.fdroid.data.InstalledAppProvider; */ public class PackageUpgradedReceiver extends PackageReceiver { + @Override + protected boolean toDiscard(Intent intent) { + return false; + } + @Override protected void handle(Context context, String appId) { PackageInfo info = getPackageInfo(context, appId); @@ -47,4 +53,4 @@ public class PackageUpgradedReceiver extends PackageReceiver { context.getContentResolver().insert(uri, values); } -} \ No newline at end of file +}