mirror of
https://codeberg.org/Freeyourgadget/Gadgetbridge.git
synced 2025-01-10 17:11:56 +01:00
calendar improvements wip
This commit is contained in:
parent
d6d956b748
commit
699ee951ac
@ -422,6 +422,11 @@ public abstract class AbstractDeviceCoordinator implements DeviceCoordinator {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean supportsCalendarAddDelete() {
|
||||||
|
return supportsCalendarEvents();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean supportsActivityDataFetching() {
|
public boolean supportsActivityDataFetching() {
|
||||||
return false;
|
return false;
|
||||||
|
@ -505,6 +505,13 @@ public interface DeviceCoordinator {
|
|||||||
*/
|
*/
|
||||||
boolean supportsCalendarEvents();
|
boolean supportsCalendarEvents();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Indicates whether the device supports adding / deleting individual calendar events. If the
|
||||||
|
* device supports calendar events, but not add/delete, a full calendar sync is called once
|
||||||
|
* every time there is any change to any of the calendar events that would be otherwise synced.
|
||||||
|
*/
|
||||||
|
boolean supportsCalendarAddDelete();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Indicates whether the device supports getting a stream of live data.
|
* Indicates whether the device supports getting a stream of live data.
|
||||||
* This can be live HR, steps etc.
|
* This can be live HR, steps etc.
|
||||||
|
@ -121,6 +121,8 @@ public interface EventHandler {
|
|||||||
|
|
||||||
void onDeleteCalendarEvent(byte type, long id);
|
void onDeleteCalendarEvent(byte type, long id);
|
||||||
|
|
||||||
|
void onCalendarSync();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the given option in the device, typically with values from the preferences.
|
* Sets the given option in the device, typically with values from the preferences.
|
||||||
* The config name is device specific.
|
* The config name is device specific.
|
||||||
|
@ -112,6 +112,11 @@ public abstract class HuamiCoordinator extends AbstractBLEDeviceCoordinator {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean supportsCalendarEvents() {
|
public boolean supportsCalendarEvents() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean supportsCalendarAddDelete() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -265,6 +265,11 @@ public abstract class ZeppOsCoordinator extends HuamiCoordinator {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean supportsCalendarAddDelete() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void deleteDevice(@NonNull final GBDevice gbDevice,
|
protected void deleteDevice(@NonNull final GBDevice gbDevice,
|
||||||
@NonNull final Device device,
|
@NonNull final Device device,
|
||||||
|
@ -230,6 +230,11 @@ public abstract class XiaomiCoordinator extends AbstractBLEDeviceCoordinator {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean supportsCalendarAddDelete() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean supportsActivityDataFetching() {
|
public boolean supportsActivityDataFetching() {
|
||||||
return true;
|
return true;
|
||||||
|
@ -116,6 +116,7 @@ public class CalendarReceiver extends BroadcastReceiver {
|
|||||||
public void syncCalendar(List<CalendarEvent> eventList, DaoSession session) {
|
public void syncCalendar(List<CalendarEvent> eventList, DaoSession session) {
|
||||||
LOG.info("Syncing with calendar.");
|
LOG.info("Syncing with calendar.");
|
||||||
Hashtable<Long, CalendarEvent> eventTable = new Hashtable<>();
|
Hashtable<Long, CalendarEvent> eventTable = new Hashtable<>();
|
||||||
|
|
||||||
Long deviceId = DBHelper.getDevice(mGBDevice, session).getId();
|
Long deviceId = DBHelper.getDevice(mGBDevice, session).getId();
|
||||||
QueryBuilder<CalendarSyncState> qb = session.getCalendarSyncStateDao().queryBuilder();
|
QueryBuilder<CalendarSyncState> qb = session.getCalendarSyncStateDao().queryBuilder();
|
||||||
|
|
||||||
@ -179,6 +180,9 @@ public class CalendarReceiver extends BroadcastReceiver {
|
|||||||
|
|
||||||
private void updateEvents(Long deviceId, DaoSession session) {
|
private void updateEvents(Long deviceId, DaoSession session) {
|
||||||
Enumeration<Long> ids = eventState.keys();
|
Enumeration<Long> ids = eventState.keys();
|
||||||
|
final boolean supportsCalendarAddDelete = mGBDevice.getDeviceCoordinator().supportsCalendarAddDelete();
|
||||||
|
boolean anyEventChanged = false;
|
||||||
|
|
||||||
while (ids.hasMoreElements()) {
|
while (ids.hasMoreElements()) {
|
||||||
Long i = ids.nextElement();
|
Long i = ids.nextElement();
|
||||||
EventSyncState es = eventState.get(i);
|
EventSyncState es = eventState.get(i);
|
||||||
@ -210,15 +214,27 @@ public class CalendarReceiver extends BroadcastReceiver {
|
|||||||
calendarEventSpec.calName = calendarEvent.getUniqueCalName();
|
calendarEventSpec.calName = calendarEvent.getUniqueCalName();
|
||||||
calendarEventSpec.color = calendarEvent.getColor();
|
calendarEventSpec.color = calendarEvent.getColor();
|
||||||
if (syncState == EventState.NEEDS_UPDATE) {
|
if (syncState == EventState.NEEDS_UPDATE) {
|
||||||
GBApplication.deviceService(mGBDevice).onDeleteCalendarEvent(CalendarEventSpec.TYPE_UNKNOWN, i);
|
if (supportsCalendarAddDelete) {
|
||||||
|
GBApplication.deviceService(mGBDevice).onDeleteCalendarEvent(CalendarEventSpec.TYPE_UNKNOWN, i);
|
||||||
|
} else {
|
||||||
|
anyEventChanged = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (supportsCalendarAddDelete) {
|
||||||
|
GBApplication.deviceService(mGBDevice).onAddCalendarEvent(calendarEventSpec);
|
||||||
|
} else {
|
||||||
|
anyEventChanged = true;
|
||||||
}
|
}
|
||||||
GBApplication.deviceService(mGBDevice).onAddCalendarEvent(calendarEventSpec);
|
|
||||||
es.setState(EventState.SYNCED);
|
es.setState(EventState.SYNCED);
|
||||||
eventState.put(i, es);
|
eventState.put(i, es);
|
||||||
// update db
|
// update db
|
||||||
session.insertOrReplace(new CalendarSyncState(null, deviceId, i, es.event.hashCode()));
|
session.insertOrReplace(new CalendarSyncState(null, deviceId, i, es.event.hashCode()));
|
||||||
} else if (syncState == EventState.NEEDS_DELETE) {
|
} else if (syncState == EventState.NEEDS_DELETE) {
|
||||||
GBApplication.deviceService(mGBDevice).onDeleteCalendarEvent(CalendarEventSpec.TYPE_UNKNOWN, i);
|
if (supportsCalendarAddDelete) {
|
||||||
|
GBApplication.deviceService(mGBDevice).onDeleteCalendarEvent(CalendarEventSpec.TYPE_UNKNOWN, i);
|
||||||
|
} else {
|
||||||
|
anyEventChanged = true;
|
||||||
|
}
|
||||||
eventState.remove(i);
|
eventState.remove(i);
|
||||||
// delete from db for current device only
|
// delete from db for current device only
|
||||||
QueryBuilder<CalendarSyncState> qb = session.getCalendarSyncStateDao().queryBuilder();
|
QueryBuilder<CalendarSyncState> qb = session.getCalendarSyncStateDao().queryBuilder();
|
||||||
@ -226,6 +242,10 @@ public class CalendarReceiver extends BroadcastReceiver {
|
|||||||
.buildDelete().executeDeleteWithoutDetachingEntities();
|
.buildDelete().executeDeleteWithoutDetachingEntities();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!supportsCalendarAddDelete && anyEventChanged) {
|
||||||
|
GBApplication.deviceService(mGBDevice).onCalendarSync();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void forceSync() {
|
public static void forceSync() {
|
||||||
|
@ -1168,6 +1168,15 @@ public abstract class AbstractDeviceSupport implements DeviceSupport {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called when the calendar needs to be synced. Only relevant if
|
||||||
|
* coordinator#supportsCalendarAddDelete is false
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void onCalendarSync() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* If configuration options can be set on the device, this method
|
* If configuration options can be set on the device, this method
|
||||||
* can be overridden and implemented by the device support class.
|
* can be overridden and implemented by the device support class.
|
||||||
|
@ -126,6 +126,7 @@ import nodomain.freeyourgadget.gadgetbridge.model.ActivityKind;
|
|||||||
import nodomain.freeyourgadget.gadgetbridge.model.ActivitySample;
|
import nodomain.freeyourgadget.gadgetbridge.model.ActivitySample;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.model.ActivityUser;
|
import nodomain.freeyourgadget.gadgetbridge.model.ActivityUser;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.model.Alarm;
|
import nodomain.freeyourgadget.gadgetbridge.model.Alarm;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.model.CalendarEventSpec;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.model.RecordedDataTypes;
|
import nodomain.freeyourgadget.gadgetbridge.model.RecordedDataTypes;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.model.SleepState;
|
import nodomain.freeyourgadget.gadgetbridge.model.SleepState;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.model.WearingState;
|
import nodomain.freeyourgadget.gadgetbridge.model.WearingState;
|
||||||
@ -2705,6 +2706,24 @@ public abstract class HuamiSupport extends AbstractBTLEDeviceSupport implements
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onAddCalendarEvent(final CalendarEventSpec calendarEventSpec) {
|
||||||
|
onCalendarSync();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onDeleteCalendarEvent(final byte type, final long id) {
|
||||||
|
onCalendarSync();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onCalendarSync() {
|
||||||
|
final TransactionBuilder builder = createTransactionBuilder("calendar sync");
|
||||||
|
sendCalendarEvents(builder);
|
||||||
|
if (builder.getTransaction().isEmpty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
builder.queue(getQueue());
|
||||||
|
}
|
||||||
|
|
||||||
protected HuamiSupport sendCalendarEvents(TransactionBuilder builder) {
|
protected HuamiSupport sendCalendarEvents(TransactionBuilder builder) {
|
||||||
if (characteristicChunked == null) { // all except Mi Band 2
|
if (characteristicChunked == null) { // all except Mi Band 2
|
||||||
sendCalendarEventsAsAlarms(builder);
|
sendCalendarEventsAsAlarms(builder);
|
||||||
@ -2974,6 +2993,9 @@ public abstract class HuamiSupport extends AbstractBTLEDeviceSupport implements
|
|||||||
case PasswordCapabilityImpl.PREF_PASSWORD_ENABLED:
|
case PasswordCapabilityImpl.PREF_PASSWORD_ENABLED:
|
||||||
setPassword(builder);
|
setPassword(builder);
|
||||||
break;
|
break;
|
||||||
|
case DeviceSettingsPreferenceConst.PREF_SYNC_CALENDAR:
|
||||||
|
onCalendarSync();
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
builder.queue(getQueue());
|
builder.queue(getQueue());
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
|
@ -400,12 +400,19 @@ public class XiaomiSupport extends AbstractDeviceSupport {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onAddCalendarEvent(final CalendarEventSpec calendarEventSpec) {
|
public void onAddCalendarEvent(final CalendarEventSpec calendarEventSpec) {
|
||||||
calendarService.onAddCalendarEvent(calendarEventSpec);
|
// we must sync everything
|
||||||
|
onCalendarSync();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onDeleteCalendarEvent(final byte type, long id) {
|
public void onDeleteCalendarEvent(final byte type, long id) {
|
||||||
calendarService.onDeleteCalendarEvent(type, id);
|
// we must sync everything
|
||||||
|
onCalendarSync();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCalendarSync() {
|
||||||
|
calendarService.syncCalendar();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -71,16 +71,6 @@ public class XiaomiCalendarService extends AbstractXiaomiService {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void onAddCalendarEvent(final CalendarEventSpec ignoredCalendarEventSpec) {
|
|
||||||
// we must sync everything
|
|
||||||
syncCalendar();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void onDeleteCalendarEvent(final byte ignoredType, final long ignoredId) {
|
|
||||||
// we must sync everything
|
|
||||||
syncCalendar();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void syncCalendar() {
|
public void syncCalendar() {
|
||||||
final boolean syncEnabled = GBApplication.getDeviceSpecificSharedPrefs(getSupport().getDevice().getAddress())
|
final boolean syncEnabled = GBApplication.getDeviceSpecificSharedPrefs(getSupport().getDevice().getAddress())
|
||||||
.getBoolean(PREF_SYNC_CALENDAR, false);
|
.getBoolean(PREF_SYNC_CALENDAR, false);
|
||||||
|
Loading…
Reference in New Issue
Block a user