Fix future events
This commit is contained in:
parent
eba5575ee2
commit
4c27d1dd9b
BIN
.idea/caches/build_file_checksums.ser
generated
BIN
.idea/caches/build_file_checksums.ser
generated
Binary file not shown.
@ -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.
@ -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() {
|
||||||
|
@ -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
|
||||||
)
|
)
|
||||||
|
@ -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()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user