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
This commit is contained in:
Daniel Martí 2014-04-29 18:18:38 +02:00
parent 55acd955b9
commit 7a16bf4ce5
5 changed files with 34 additions and 4 deletions

View File

@ -291,7 +291,7 @@
</receiver>
<receiver android:name=".PackageUpgradedReceiver" >
<intent-filter>
<action android:name="android.intent.action.PACKAGE_CHANGED" />
<action android:name="android.intent.action.PACKAGE_REPLACED" />
<data android:scheme="package" />
</intent-filter>

View File

@ -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);
}
}
}

View File

@ -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);

View File

@ -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);
}
}
}

View File

@ -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);
}
}
}