diff --git a/.idea/caches/build_file_checksums.ser b/.idea/caches/build_file_checksums.ser index 9d8ff53..cebaf33 100644 Binary files a/.idea/caches/build_file_checksums.ser and b/.idea/caches/build_file_checksums.ser differ diff --git a/app/build.gradle b/app/build.gradle index be84d4f..54991d6 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -18,7 +18,7 @@ android { applicationId "com.tommasoberlose.anotherwidget" minSdkVersion 23 targetSdkVersion 29 - versionCode 94 + versionCode 96 versionName "2.0.9" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" diff --git a/app/release/app-release.aab b/app/release/app-release.aab index a265ff2..95d59bb 100644 Binary files a/app/release/app-release.aab and b/app/release/app-release.aab differ diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/db/EventRepository.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/db/EventRepository.kt index 5e63de8..a497ee1 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/db/EventRepository.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/db/EventRepository.kt @@ -46,7 +46,22 @@ class EventRepository(val context: Context) { fun getNextEvent(): Event? { 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 } else { val events = getEvents() @@ -107,12 +122,32 @@ class EventRepository(val context: Context) { MainWidget.updateWidget(context) } - fun getEvents(): RealmResults { + fun getFutureEvents(): RealmResults { val now = Calendar.getInstance().timeInMillis realm.refresh() return realm.where(Event::class.java).greaterThan("endDate", now).findAll() } + private fun getEvents(): RealmResults { + 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 close() { diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/helpers/CalendarHelper.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/helpers/CalendarHelper.kt index 307381a..57a3981 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/helpers/CalendarHelper.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/helpers/CalendarHelper.kt @@ -37,23 +37,11 @@ object CalendarHelper { set(Calendar.MINUTE, 0) set(Calendar.HOUR_OF_DAY, 0) } - val limit = Calendar.getInstance() - when (Preferences.showUntil) { - 0 -> limit.add(Calendar.HOUR, 3) - 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 limit = Calendar.getInstance().apply { + timeInMillis = begin.timeInMillis + add(Calendar.DAY_OF_YEAR, 2) } - val builder = CalendarContract.Instances.CONTENT_URI.buildUpon() - ContentUris.appendId(builder, begin.timeInMillis) - ContentUris.appendId(builder, limit.timeInMillis) - if (!context.checkGrantedPermission( Manifest.permission.READ_CALENDAR ) diff --git a/app/src/main/java/com/tommasoberlose/anotherwidget/receivers/UpdatesReceiver.kt b/app/src/main/java/com/tommasoberlose/anotherwidget/receivers/UpdatesReceiver.kt index acfe878..c930d86 100644 --- a/app/src/main/java/com/tommasoberlose/anotherwidget/receivers/UpdatesReceiver.kt +++ b/app/src/main/java/com/tommasoberlose/anotherwidget/receivers/UpdatesReceiver.kt @@ -29,12 +29,12 @@ class UpdatesReceiver : BroadcastReceiver() { Intent.ACTION_TIME_CHANGED, Intent.ACTION_TIMEZONE_CHANGED, Intent.ACTION_LOCALE_CHANGED, + Intent.ACTION_DATE_CHANGED, Actions.ACTION_CALENDAR_UPDATE -> { CalendarHelper.updateEventList(context) } "com.sec.android.widgetapp.APPWIDGET_RESIZE", - Intent.ACTION_DATE_CHANGED, AlarmManager.ACTION_NEXT_ALARM_CLOCK_CHANGED, Actions.ACTION_TIME_UPDATE -> { MainWidget.updateWidget(context) @@ -53,7 +53,7 @@ class UpdatesReceiver : BroadcastReceiver() { if (eventId == null) { removeUpdates(context) - eventRepository.getEvents().forEach { event -> + eventRepository.getFutureEvents().forEach { event -> setEventUpdate(context, event) } } else { @@ -72,65 +72,92 @@ class UpdatesReceiver : BroadcastReceiver() { set(Calendar.MILLISECOND, 0) } val diff = Period(now.timeInMillis, event.startDate) - 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 + val limit = when (Preferences.showUntil) { + 0 -> 1000 * 60 * 60 * 3 + 1 -> 1000 * 60 * 60 * 6 + 2 -> 1000 * 60 * 60 * 12 + 3 -> 1000 * 60 * 60 * 24 + 4 -> 1000 * 60 * 60 * 24 * 3 + 5 -> 1000 * 60 * 60 * 24 * 7 + 6 -> 1000 * 60 * 30 + 7 -> 1000 * 60 * 60 + else -> 1000 * 60 * 60 * 6 + } + 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 -> { - minutes = diff.minutes - (diff.minutes % 5) - } - } - setExact( - AlarmManager.RTC, - if (event.startDate - minutes * 1000 * 60 > (now.timeInMillis + 120 * 1000)) event.startDate - 60 * 1000 * minutes else now.timeInMillis + 120000, - PendingIntent.getBroadcast( - context, - event.eventID.toInt(), - Intent(context, UpdatesReceiver::class.java).apply { - action = Actions.ACTION_TIME_UPDATE - putExtra(EVENT_ID, event.eventID) - }, - 0 + setExact( + AlarmManager.RTC, + if (event.startDate - minutes * 1000 * 60 > (now.timeInMillis + 120 * 1000)) event.startDate - 60 * 1000 * minutes else now.timeInMillis + 120000, + 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 { + 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 { + // 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( AlarmManager.RTC, - event.startDate - diff.hours * 1000 * 60 * 60 + if (diff.minutes > 30) (- 30) else (+ 30), + fireTime, PendingIntent.getBroadcast( context, event.eventID.toInt(), Intent(context, UpdatesReceiver::class.java).apply { action = Actions.ACTION_TIME_UPDATE - putExtra(EVENT_ID, event.eventID) }, 0 ) ) } } 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( AlarmManager.RTC, - fireTime, + if (event.startDate - limit > now.timeInMillis + 120 * 1000) event.startDate - limit else now.timeInMillis + 120000, PendingIntent.getBroadcast( context, event.eventID.toInt(), Intent(context, UpdatesReceiver::class.java).apply { 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) { with(context.getSystemService(Context.ALARM_SERVICE) as AlarmManager) { val eventRepository = EventRepository(context) - eventRepository.getEvents().forEach { + eventRepository.getFutureEvents().forEach { cancel(PendingIntent.getBroadcast(context, it.eventID.toInt(), Intent(context, UpdatesReceiver::class.java), 0)) } eventRepository.close()