diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/CalendarReceiver.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/CalendarReceiver.java index c3ea7cb8e..20bcb4f17 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/CalendarReceiver.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/CalendarReceiver.java @@ -90,6 +90,10 @@ public class CalendarReceiver extends BroadcastReceiver { onReceive(GBApplication.getContext(), new Intent()); } + public GBDevice getGBDevice(){ + return mGBDevice; + } + @Override public void onReceive(Context context, Intent intent) { LOG.info("got calendar changed broadcast"); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/DeviceCommunicationService.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/DeviceCommunicationService.java index b28aba862..f70f62771 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/DeviceCommunicationService.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/DeviceCommunicationService.java @@ -316,7 +316,7 @@ public class DeviceCommunicationService extends Service implements SharedPrefere private AutoConnectIntervalReceiver mAutoConnectInvervalReceiver= null; private AlarmReceiver mAlarmReceiver = null; - private CalendarReceiver mCalendarReceiver = null; + private List mCalendarReceiver = new ArrayList<>(); private CMWeatherReceiver mCMWeatherReceiver = null; private LineageOsWeatherReceiver mLineageOsWeatherReceiver = null; private TinyWeatherForecastGermanyReceiver mTinyWeatherForecastGermanyReceiver = null; @@ -371,6 +371,7 @@ public class DeviceCommunicationService extends Service implements SharedPrefere private void updateReceiversState(){ boolean enableReceivers = false; boolean anyDeviceInitialized = false; + List devicesWithCalendar = new ArrayList<>(); FeatureSet features = new FeatureSet(); @@ -386,10 +387,12 @@ public class DeviceCommunicationService extends Service implements SharedPrefere DeviceCoordinator coordinator = struct.getCoordinator(); if(coordinator != null){ features.logicalOr(coordinator); + if (coordinator.supportsCalendarEvents()){ + devicesWithCalendar.add(struct.getDevice()); + } } } - - setReceiversEnableState(enableReceivers, anyDeviceInitialized, features); + setReceiversEnableState(enableReceivers, anyDeviceInitialized, features, devicesWithCalendar); } @Override @@ -967,8 +970,17 @@ public class DeviceCommunicationService extends Service implements SharedPrefere return false; } + private boolean deviceHasCalendarReceiverRegistered(GBDevice device){ + for (CalendarReceiver receiver: mCalendarReceiver){ + if(receiver.getGBDevice().equals(device)){ + return true; + } + } + return false; + } - private void setReceiversEnableState(boolean enable, boolean initialized, FeatureSet features) { + + private void setReceiversEnableState(boolean enable, boolean initialized, FeatureSet features, List devicesWithCalendar) { LOG.info("Setting broadcast receivers to: " + enable); if(enable && features == null){ @@ -976,14 +988,17 @@ public class DeviceCommunicationService extends Service implements SharedPrefere } if (enable && initialized && features.supportsCalendarEvents()) { - if (mCalendarReceiver == null) { - if (!(GBApplication.isRunningMarshmallowOrLater() && ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CALENDAR) == PackageManager.PERMISSION_DENIED)) { - IntentFilter calendarIntentFilter = new IntentFilter(); - calendarIntentFilter.addAction("android.intent.action.PROVIDER_CHANGED"); - calendarIntentFilter.addDataScheme("content"); - calendarIntentFilter.addDataAuthority("com.android.calendar", null); - mCalendarReceiver = new CalendarReceiver(null); - registerReceiver(mCalendarReceiver, calendarIntentFilter); + for (GBDevice deviceWithCalendar : devicesWithCalendar) { + if (!deviceHasCalendarReceiverRegistered(deviceWithCalendar)) { + if (!(GBApplication.isRunningMarshmallowOrLater() && ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CALENDAR) == PackageManager.PERMISSION_DENIED)) { + IntentFilter calendarIntentFilter = new IntentFilter(); + calendarIntentFilter.addAction("android.intent.action.PROVIDER_CHANGED"); + calendarIntentFilter.addDataScheme("content"); + calendarIntentFilter.addDataAuthority("com.android.calendar", null); + CalendarReceiver receiver = new CalendarReceiver(deviceWithCalendar); + registerReceiver(receiver, calendarIntentFilter); + mCalendarReceiver.add(receiver); + } } } if (mAlarmReceiver == null) { @@ -991,10 +1006,10 @@ public class DeviceCommunicationService extends Service implements SharedPrefere registerReceiver(mAlarmReceiver, new IntentFilter("DAILY_ALARM")); } } else { - if (mCalendarReceiver != null) { - unregisterReceiver(mCalendarReceiver); - mCalendarReceiver = null; + for (CalendarReceiver registeredReceiver: mCalendarReceiver){ + unregisterReceiver(registeredReceiver); } + mCalendarReceiver.clear(); if (mAlarmReceiver != null) { unregisterReceiver(mAlarmReceiver); mAlarmReceiver = null; @@ -1152,7 +1167,7 @@ public class DeviceCommunicationService extends Service implements SharedPrefere super.onDestroy(); LocalBroadcastManager.getInstance(this).unregisterReceiver(mReceiver); - setReceiversEnableState(false, false, null); // disable BroadcastReceivers + setReceiversEnableState(false, false, null, null); // disable BroadcastReceivers unregisterReceiver(mBlueToothConnectReceiver);