Fix future events

This commit is contained in:
Tommaso Berlose 2020-05-18 20:36:59 +02:00
parent eba5575ee2
commit 4c27d1dd9b
6 changed files with 105 additions and 55 deletions

Binary file not shown.

View File

@ -18,7 +18,7 @@ android {
applicationId "com.tommasoberlose.anotherwidget" applicationId "com.tommasoberlose.anotherwidget"
minSdkVersion 23 minSdkVersion 23
targetSdkVersion 29 targetSdkVersion 29
versionCode 94 versionCode 96
versionName "2.0.9" versionName "2.0.9"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

Binary file not shown.

View File

@ -46,7 +46,22 @@ class EventRepository(val context: Context) {
fun getNextEvent(): Event? { fun getNextEvent(): Event? {
val nextEvent = getEventByEventId(Preferences.nextEventId) val nextEvent = getEventByEventId(Preferences.nextEventId)
val event = if (nextEvent != null && nextEvent.endDate > Calendar.getInstance().timeInMillis) { val now = Calendar.getInstance().timeInMillis
val limit = Calendar.getInstance().apply {
timeInMillis = now
when (Preferences.showUntil) {
0 -> add(Calendar.HOUR, 3)
1 -> add(Calendar.HOUR, 6)
2 -> add(Calendar.HOUR, 12)
3 -> add(Calendar.DAY_OF_MONTH, 1)
4 -> add(Calendar.DAY_OF_MONTH, 3)
5 -> add(Calendar.DAY_OF_MONTH, 7)
6 -> add(Calendar.MINUTE, 30)
7 -> add(Calendar.HOUR, 1)
else -> add(Calendar.HOUR, 6)
}
}
val event = if (nextEvent != null && nextEvent.endDate > now && nextEvent.startDate < limit.timeInMillis) {
nextEvent nextEvent
} else { } else {
val events = getEvents() val events = getEvents()
@ -107,12 +122,32 @@ class EventRepository(val context: Context) {
MainWidget.updateWidget(context) MainWidget.updateWidget(context)
} }
fun getEvents(): RealmResults<Event> { fun getFutureEvents(): RealmResults<Event> {
val now = Calendar.getInstance().timeInMillis val now = Calendar.getInstance().timeInMillis
realm.refresh() realm.refresh()
return realm.where(Event::class.java).greaterThan("endDate", now).findAll() return realm.where(Event::class.java).greaterThan("endDate", now).findAll()
} }
private fun getEvents(): RealmResults<Event> {
val now = Calendar.getInstance().timeInMillis
val limit = Calendar.getInstance().apply {
timeInMillis = now
when (Preferences.showUntil) {
0 -> add(Calendar.HOUR, 3)
1 -> add(Calendar.HOUR, 6)
2 -> add(Calendar.HOUR, 12)
3 -> add(Calendar.DAY_OF_MONTH, 1)
4 -> add(Calendar.DAY_OF_MONTH, 3)
5 -> add(Calendar.DAY_OF_MONTH, 7)
6 -> add(Calendar.MINUTE, 30)
7 -> add(Calendar.HOUR, 1)
else -> add(Calendar.HOUR, 6)
}
}
realm.refresh()
return realm.where(Event::class.java).greaterThan("endDate", now).lessThanOrEqualTo("startDate", limit.timeInMillis).findAll()
}
fun getEventsCount(): Int = getEvents().size fun getEventsCount(): Int = getEvents().size
fun close() { fun close() {

View File

@ -37,23 +37,11 @@ object CalendarHelper {
set(Calendar.MINUTE, 0) set(Calendar.MINUTE, 0)
set(Calendar.HOUR_OF_DAY, 0) set(Calendar.HOUR_OF_DAY, 0)
} }
val limit = Calendar.getInstance() val limit = Calendar.getInstance().apply {
when (Preferences.showUntil) { timeInMillis = begin.timeInMillis
0 -> limit.add(Calendar.HOUR, 3) add(Calendar.DAY_OF_YEAR, 2)
1 -> limit.add(Calendar.HOUR, 6)
2 -> limit.add(Calendar.HOUR, 12)
3 -> limit.add(Calendar.DAY_OF_MONTH, 1)
4 -> limit.add(Calendar.DAY_OF_MONTH, 3)
5 -> limit.add(Calendar.DAY_OF_MONTH, 7)
6 -> limit.add(Calendar.MINUTE, 30)
7 -> limit.add(Calendar.HOUR, 1)
else -> limit.add(Calendar.HOUR, 6)
} }
val builder = CalendarContract.Instances.CONTENT_URI.buildUpon()
ContentUris.appendId(builder, begin.timeInMillis)
ContentUris.appendId(builder, limit.timeInMillis)
if (!context.checkGrantedPermission( if (!context.checkGrantedPermission(
Manifest.permission.READ_CALENDAR Manifest.permission.READ_CALENDAR
) )

View File

@ -29,12 +29,12 @@ class UpdatesReceiver : BroadcastReceiver() {
Intent.ACTION_TIME_CHANGED, Intent.ACTION_TIME_CHANGED,
Intent.ACTION_TIMEZONE_CHANGED, Intent.ACTION_TIMEZONE_CHANGED,
Intent.ACTION_LOCALE_CHANGED, Intent.ACTION_LOCALE_CHANGED,
Intent.ACTION_DATE_CHANGED,
Actions.ACTION_CALENDAR_UPDATE -> { Actions.ACTION_CALENDAR_UPDATE -> {
CalendarHelper.updateEventList(context) CalendarHelper.updateEventList(context)
} }
"com.sec.android.widgetapp.APPWIDGET_RESIZE", "com.sec.android.widgetapp.APPWIDGET_RESIZE",
Intent.ACTION_DATE_CHANGED,
AlarmManager.ACTION_NEXT_ALARM_CLOCK_CHANGED, AlarmManager.ACTION_NEXT_ALARM_CLOCK_CHANGED,
Actions.ACTION_TIME_UPDATE -> { Actions.ACTION_TIME_UPDATE -> {
MainWidget.updateWidget(context) MainWidget.updateWidget(context)
@ -53,7 +53,7 @@ class UpdatesReceiver : BroadcastReceiver() {
if (eventId == null) { if (eventId == null) {
removeUpdates(context) removeUpdates(context)
eventRepository.getEvents().forEach { event -> eventRepository.getFutureEvents().forEach { event ->
setEventUpdate(context, event) setEventUpdate(context, event)
} }
} else { } else {
@ -72,65 +72,92 @@ class UpdatesReceiver : BroadcastReceiver() {
set(Calendar.MILLISECOND, 0) set(Calendar.MILLISECOND, 0)
} }
val diff = Period(now.timeInMillis, event.startDate) val diff = Period(now.timeInMillis, event.startDate)
if (event.startDate > now.timeInMillis) { val limit = when (Preferences.showUntil) {
// Update the widget every hour till the event 0 -> 1000 * 60 * 60 * 3
if (diff.hours == 0) { 1 -> 1000 * 60 * 60 * 6
var minutes = 0 2 -> 1000 * 60 * 60 * 12
when (Preferences.widgetUpdateFrequency) { 3 -> 1000 * 60 * 60 * 24
Constants.WidgetUpdateFrequency.DEFAULT.value -> { 4 -> 1000 * 60 * 60 * 24 * 3
minutes = when { 5 -> 1000 * 60 * 60 * 24 * 7
diff.minutes > 50 -> 50 6 -> 1000 * 60 * 30
diff.minutes > 30 -> 30 7 -> 1000 * 60 * 60
diff.minutes > 15 -> 15 else -> 1000 * 60 * 60 * 6
else -> 0 }
if (event.startDate <= limit) {
if (event.startDate > now.timeInMillis) {
// Update the widget every hour till the event
if (diff.hours == 0) {
var minutes = 0
when (Preferences.widgetUpdateFrequency) {
Constants.WidgetUpdateFrequency.DEFAULT.value -> {
minutes = when {
diff.minutes > 50 -> 50
diff.minutes > 30 -> 30
diff.minutes > 15 -> 15
else -> 0
}
}
Constants.WidgetUpdateFrequency.HIGH.value -> {
minutes = diff.minutes - (diff.minutes % 5)
} }
} }
Constants.WidgetUpdateFrequency.HIGH.value -> { setExact(
minutes = diff.minutes - (diff.minutes % 5) AlarmManager.RTC,
} if (event.startDate - minutes * 1000 * 60 > (now.timeInMillis + 120 * 1000)) event.startDate - 60 * 1000 * minutes else now.timeInMillis + 120000,
} PendingIntent.getBroadcast(
setExact( context,
AlarmManager.RTC, event.eventID.toInt(),
if (event.startDate - minutes * 1000 * 60 > (now.timeInMillis + 120 * 1000)) event.startDate - 60 * 1000 * minutes else now.timeInMillis + 120000, Intent(context, UpdatesReceiver::class.java).apply {
PendingIntent.getBroadcast( action = Actions.ACTION_TIME_UPDATE
context, putExtra(EVENT_ID, event.eventID)
event.eventID.toInt(), },
Intent(context, UpdatesReceiver::class.java).apply { PendingIntent.FLAG_UPDATE_CURRENT
action = Actions.ACTION_TIME_UPDATE )
putExtra(EVENT_ID, event.eventID)
},
0
) )
) } else {
setExact(
AlarmManager.RTC,
event.startDate - diff.hours * 1000 * 60 * 60 + if (diff.minutes > 30) (-30) else (+30),
PendingIntent.getBroadcast(
context,
event.eventID.toInt(),
Intent(context, UpdatesReceiver::class.java).apply {
action = Actions.ACTION_TIME_UPDATE
putExtra(EVENT_ID, event.eventID)
},
PendingIntent.FLAG_UPDATE_CURRENT
)
)
}
} else { } else {
// Update the widget one second after the event is finished
val fireTime =
if (event.endDate > now.timeInMillis + 120 * 1000) event.endDate else now.timeInMillis + 120000
setExact( setExact(
AlarmManager.RTC, AlarmManager.RTC,
event.startDate - diff.hours * 1000 * 60 * 60 + if (diff.minutes > 30) (- 30) else (+ 30), fireTime,
PendingIntent.getBroadcast( PendingIntent.getBroadcast(
context, context,
event.eventID.toInt(), event.eventID.toInt(),
Intent(context, UpdatesReceiver::class.java).apply { Intent(context, UpdatesReceiver::class.java).apply {
action = Actions.ACTION_TIME_UPDATE action = Actions.ACTION_TIME_UPDATE
putExtra(EVENT_ID, event.eventID)
}, },
0 0
) )
) )
} }
} else { } else {
// Update the widget one second after the event is finished
val fireTime =
if (event.endDate > now.timeInMillis + 120 * 1000) event.endDate else now.timeInMillis + 120000
setExact( setExact(
AlarmManager.RTC, AlarmManager.RTC,
fireTime, if (event.startDate - limit > now.timeInMillis + 120 * 1000) event.startDate - limit else now.timeInMillis + 120000,
PendingIntent.getBroadcast( PendingIntent.getBroadcast(
context, context,
event.eventID.toInt(), event.eventID.toInt(),
Intent(context, UpdatesReceiver::class.java).apply { Intent(context, UpdatesReceiver::class.java).apply {
action = Actions.ACTION_TIME_UPDATE action = Actions.ACTION_TIME_UPDATE
putExtra(EVENT_ID, event.eventID)
}, },
0 PendingIntent.FLAG_UPDATE_CURRENT
) )
) )
} }
@ -140,7 +167,7 @@ class UpdatesReceiver : BroadcastReceiver() {
fun removeUpdates(context: Context) { fun removeUpdates(context: Context) {
with(context.getSystemService(Context.ALARM_SERVICE) as AlarmManager) { with(context.getSystemService(Context.ALARM_SERVICE) as AlarmManager) {
val eventRepository = EventRepository(context) val eventRepository = EventRepository(context)
eventRepository.getEvents().forEach { eventRepository.getFutureEvents().forEach {
cancel(PendingIntent.getBroadcast(context, it.eventID.toInt(), Intent(context, UpdatesReceiver::class.java), 0)) cancel(PendingIntent.getBroadcast(context, it.eventID.toInt(), Intent(context, UpdatesReceiver::class.java), 0))
} }
eventRepository.close() eventRepository.close()