Merge branch 'explicit-pending-intents' into 'master'
Ensure PendingIntents use explicit Intents See merge request !485
This commit is contained in:
commit
cb241a23ef
@ -229,6 +229,7 @@
|
||||
<category android:name="android.intent.category.HOME" />
|
||||
</intent-filter>
|
||||
</receiver>
|
||||
|
||||
<receiver android:name=".receiver.PackageManagerReceiver">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.PACKAGE_ADDED" />
|
||||
@ -238,12 +239,17 @@
|
||||
<data android:scheme="package" />
|
||||
</intent-filter>
|
||||
</receiver>
|
||||
|
||||
<receiver android:name=".receiver.WifiStateChangeReceiver" >
|
||||
<intent-filter>
|
||||
<action android:name="android.net.wifi.STATE_CHANGE" />
|
||||
</intent-filter>
|
||||
</receiver>
|
||||
|
||||
<receiver android:name=".NotificationBroadcastReceiver" android:exported="false">
|
||||
<!-- Doesn't require an intent-filter because it is explicitly invoked via Intent.setClass() -->
|
||||
</receiver>
|
||||
|
||||
<service android:name=".UpdateService" />
|
||||
<service
|
||||
android:name=".net.DownloaderService"
|
||||
|
@ -145,7 +145,7 @@ public class FDroidApp extends Application {
|
||||
|
||||
/**
|
||||
* Force reload the {@link Activity to make theme changes take effect.}
|
||||
* Same as {@link Languages.forceChangeLanguage}
|
||||
* Same as {@link Languages#forceChangeLanguage(Activity)}
|
||||
*
|
||||
* @param activity the {@code Activity} to force reload
|
||||
*/
|
||||
|
@ -0,0 +1,38 @@
|
||||
package org.fdroid.fdroid;
|
||||
|
||||
import android.content.BroadcastReceiver;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
|
||||
/**
|
||||
* For security purposes we need to ensure that all Intent objects we give to a PendingIntent are
|
||||
* explicitly set to be delivered to an F-Droid class.
|
||||
* This class takes the global intent received from outside our process (i.e. from the
|
||||
* notification manager) and passes it onto the {@link AppUpdateStatusManager}.
|
||||
*/
|
||||
public class NotificationBroadcastReceiver extends BroadcastReceiver {
|
||||
@Override
|
||||
public void onReceive(Context context, Intent intent) {
|
||||
AppUpdateStatusManager manager = AppUpdateStatusManager.getInstance(context);
|
||||
String notificationKey = intent.getStringExtra(NotificationHelper.EXTRA_NOTIFICATION_KEY);
|
||||
switch (intent.getAction()) {
|
||||
case NotificationHelper.BROADCAST_NOTIFICATIONS_ALL_UPDATES_CLEARED:
|
||||
manager.clearAllUpdates();
|
||||
break;
|
||||
case NotificationHelper.BROADCAST_NOTIFICATIONS_ALL_INSTALLED_CLEARED:
|
||||
manager.clearAllInstalled();
|
||||
break;
|
||||
case NotificationHelper.BROADCAST_NOTIFICATIONS_UPDATE_CLEARED:
|
||||
// If clearing apps in state "InstallError" (like when auto-cancelling) we
|
||||
// remove them from the status manager entirely.
|
||||
AppUpdateStatusManager.AppUpdateStatus appUpdateStatus = manager.get(notificationKey);
|
||||
if (appUpdateStatus != null && appUpdateStatus.status == AppUpdateStatusManager.Status.InstallError) {
|
||||
manager.removeApk(notificationKey);
|
||||
}
|
||||
break;
|
||||
case NotificationHelper.BROADCAST_NOTIFICATIONS_INSTALLED_CLEARED:
|
||||
manager.removeApk(notificationKey);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
@ -36,10 +36,10 @@ import java.util.ArrayList;
|
||||
|
||||
class NotificationHelper {
|
||||
|
||||
private static final String BROADCAST_NOTIFICATIONS_ALL_UPDATES_CLEARED = "org.fdroid.fdroid.installer.notifications.allupdates.cleared";
|
||||
private static final String BROADCAST_NOTIFICATIONS_ALL_INSTALLED_CLEARED = "org.fdroid.fdroid.installer.notifications.allinstalled.cleared";
|
||||
private static final String BROADCAST_NOTIFICATIONS_UPDATE_CLEARED = "org.fdroid.fdroid.installer.notifications.update.cleared";
|
||||
private static final String BROADCAST_NOTIFICATIONS_INSTALLED_CLEARED = "org.fdroid.fdroid.installer.notifications.installed.cleared";
|
||||
static final String BROADCAST_NOTIFICATIONS_ALL_UPDATES_CLEARED = "org.fdroid.fdroid.installer.notifications.allupdates.cleared";
|
||||
static final String BROADCAST_NOTIFICATIONS_ALL_INSTALLED_CLEARED = "org.fdroid.fdroid.installer.notifications.allinstalled.cleared";
|
||||
static final String BROADCAST_NOTIFICATIONS_UPDATE_CLEARED = "org.fdroid.fdroid.installer.notifications.update.cleared";
|
||||
static final String BROADCAST_NOTIFICATIONS_INSTALLED_CLEARED = "org.fdroid.fdroid.installer.notifications.installed.cleared";
|
||||
|
||||
private static final int NOTIFY_ID_UPDATES = 1;
|
||||
private static final int NOTIFY_ID_INSTALLED = 2;
|
||||
@ -47,7 +47,7 @@ class NotificationHelper {
|
||||
private static final int MAX_UPDATES_TO_SHOW = 5;
|
||||
private static final int MAX_INSTALLED_TO_SHOW = 10;
|
||||
|
||||
private static final String EXTRA_NOTIFICATION_KEY = "key";
|
||||
static final String EXTRA_NOTIFICATION_KEY = "key";
|
||||
private static final String GROUP_UPDATES = "updates";
|
||||
private static final String GROUP_INSTALLED = "installed";
|
||||
|
||||
@ -69,39 +69,7 @@ class NotificationHelper {
|
||||
.bitmapConfig(Bitmap.Config.RGB_565)
|
||||
.build();
|
||||
|
||||
// We need to listen to when notifications are cleared, so that we "forget" all that we currently know about updates
|
||||
// and installs.
|
||||
IntentFilter filter = new IntentFilter();
|
||||
filter.addAction(BROADCAST_NOTIFICATIONS_ALL_UPDATES_CLEARED);
|
||||
filter.addAction(BROADCAST_NOTIFICATIONS_ALL_INSTALLED_CLEARED);
|
||||
filter.addAction(BROADCAST_NOTIFICATIONS_UPDATE_CLEARED);
|
||||
filter.addAction(BROADCAST_NOTIFICATIONS_INSTALLED_CLEARED);
|
||||
BroadcastReceiver receiverNotificationsCleared = new BroadcastReceiver() {
|
||||
@Override
|
||||
public void onReceive(Context context, Intent intent) {
|
||||
switch (intent.getAction()) {
|
||||
case BROADCAST_NOTIFICATIONS_ALL_UPDATES_CLEARED:
|
||||
appUpdateStatusManager.clearAllUpdates();
|
||||
break;
|
||||
case BROADCAST_NOTIFICATIONS_ALL_INSTALLED_CLEARED:
|
||||
appUpdateStatusManager.clearAllInstalled();
|
||||
break;
|
||||
case BROADCAST_NOTIFICATIONS_UPDATE_CLEARED:
|
||||
// If clearing apps in state "InstallError" (like when auto-cancelling) we
|
||||
// remove them from the status manager entirely.
|
||||
AppUpdateStatusManager.AppUpdateStatus appUpdateStatus = appUpdateStatusManager.get(intent.getStringExtra(EXTRA_NOTIFICATION_KEY));
|
||||
if (appUpdateStatus != null && appUpdateStatus.status == AppUpdateStatusManager.Status.InstallError) {
|
||||
appUpdateStatusManager.removeApk(intent.getStringExtra(EXTRA_NOTIFICATION_KEY));
|
||||
}
|
||||
break;
|
||||
case BROADCAST_NOTIFICATIONS_INSTALLED_CLEARED:
|
||||
appUpdateStatusManager.removeApk(intent.getStringExtra(EXTRA_NOTIFICATION_KEY));
|
||||
break;
|
||||
}
|
||||
}
|
||||
};
|
||||
context.registerReceiver(receiverNotificationsCleared, filter);
|
||||
filter = new IntentFilter();
|
||||
filter.addAction(AppUpdateStatusManager.BROADCAST_APPSTATUS_LIST_CHANGED);
|
||||
filter.addAction(AppUpdateStatusManager.BROADCAST_APPSTATUS_ADDED);
|
||||
filter.addAction(AppUpdateStatusManager.BROADCAST_APPSTATUS_CHANGED);
|
||||
@ -371,6 +339,7 @@ class NotificationHelper {
|
||||
|
||||
Intent intentDeleted = new Intent(BROADCAST_NOTIFICATIONS_UPDATE_CLEARED);
|
||||
intentDeleted.putExtra(EXTRA_NOTIFICATION_KEY, entry.getUniqueKey());
|
||||
intentDeleted.setClass(context, NotificationBroadcastReceiver.class);
|
||||
PendingIntent piDeleted = PendingIntent.getBroadcast(context, 0, intentDeleted, PendingIntent.FLAG_UPDATE_CURRENT);
|
||||
builder.setDeleteIntent(piDeleted);
|
||||
return builder.build();
|
||||
@ -429,6 +398,7 @@ class NotificationHelper {
|
||||
}
|
||||
|
||||
Intent intentDeleted = new Intent(BROADCAST_NOTIFICATIONS_ALL_UPDATES_CLEARED);
|
||||
intentDeleted.setClass(context, NotificationBroadcastReceiver.class);
|
||||
PendingIntent piDeleted = PendingIntent.getBroadcast(context, 0, intentDeleted, PendingIntent.FLAG_UPDATE_CURRENT);
|
||||
builder.setDeleteIntent(piDeleted);
|
||||
return builder.build();
|
||||
@ -456,6 +426,7 @@ class NotificationHelper {
|
||||
|
||||
Intent intentDeleted = new Intent(BROADCAST_NOTIFICATIONS_INSTALLED_CLEARED);
|
||||
intentDeleted.putExtra(EXTRA_NOTIFICATION_KEY, entry.getUniqueKey());
|
||||
intentDeleted.setClass(context, NotificationBroadcastReceiver.class);
|
||||
PendingIntent piDeleted = PendingIntent.getBroadcast(context, 0, intentDeleted, PendingIntent.FLAG_UPDATE_CURRENT);
|
||||
builder.setDeleteIntent(piDeleted);
|
||||
return builder.build();
|
||||
@ -501,6 +472,7 @@ class NotificationHelper {
|
||||
.setGroupSummary(true);
|
||||
}
|
||||
Intent intentDeleted = new Intent(BROADCAST_NOTIFICATIONS_ALL_INSTALLED_CLEARED);
|
||||
intentDeleted.setClass(context, NotificationBroadcastReceiver.class);
|
||||
PendingIntent piDeleted = PendingIntent.getBroadcast(context, 0, intentDeleted, PendingIntent.FLAG_UPDATE_CURRENT);
|
||||
builder.setDeleteIntent(piDeleted);
|
||||
return builder.build();
|
||||
|
Loading…
x
Reference in New Issue
Block a user