Skip to content

Commit

Permalink
Add an alarm to update the widget every hour
Browse files Browse the repository at this point in the history
Fixes #68
  • Loading branch information
albertvaka committed Oct 2, 2024
1 parent d268453 commit 231ea37
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 8 deletions.
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package org.kde.bettercounter.extensions

import java.time.LocalDateTime
import java.time.ZoneId
import java.time.temporal.ChronoUnit
import java.util.Calendar
Expand Down Expand Up @@ -32,3 +33,9 @@ fun ChronoUnit.toCalendarField(): Int {
else -> throw UnsupportedOperationException("$this can't be converted to Calendar field")
}
}

fun millisecondsUntilNextHour(): Long {
val current = LocalDateTime.now()
val nextHour = current.truncatedTo(ChronoUnit.HOURS).plusHours(1)
return ChronoUnit.MILLIS.between(current, nextHour)
}
9 changes: 1 addition & 8 deletions app/src/main/java/org/kde/bettercounter/ui/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -37,11 +37,10 @@ import org.kde.bettercounter.boilerplate.OpenFileParams
import org.kde.bettercounter.boilerplate.OpenFileResultContract
import org.kde.bettercounter.databinding.ActivityMainBinding
import org.kde.bettercounter.databinding.ProgressDialogBinding
import org.kde.bettercounter.extensions.millisecondsUntilNextHour
import org.kde.bettercounter.persistence.CounterSummary
import org.kde.bettercounter.persistence.Interval
import org.kde.bettercounter.persistence.Tutorial
import java.time.LocalDateTime
import java.time.temporal.ChronoUnit

class MainActivity : AppCompatActivity() {

Expand Down Expand Up @@ -168,12 +167,6 @@ class MainActivity : AppCompatActivity() {
startRefreshEveryHourBoundary()
}

private fun millisecondsUntilNextHour(): Long {
val current = LocalDateTime.now()
val nextHour = current.truncatedTo(ChronoUnit.HOURS).plusHours(1)
return ChronoUnit.MILLIS.between(current, nextHour)
}

private fun startRefreshEveryHourBoundary() {
lifecycleScope.launch(Dispatchers.IO) {
while (isActive) {
Expand Down
32 changes: 32 additions & 0 deletions app/src/main/java/org/kde/bettercounter/ui/WidgetProvider.kt
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package org.kde.bettercounter.ui

import android.app.AlarmManager
import android.app.PendingIntent
import android.appwidget.AppWidgetHost
import android.appwidget.AppWidgetManager
Expand All @@ -14,6 +15,7 @@ import org.kde.bettercounter.BetterApplication
import org.kde.bettercounter.BuildConfig
import org.kde.bettercounter.R
import org.kde.bettercounter.ViewModel
import org.kde.bettercounter.extensions.millisecondsUntilNextHour
import org.kde.bettercounter.persistence.CounterSummary
import java.text.SimpleDateFormat
import java.util.Date
Expand All @@ -25,6 +27,36 @@ private const val TAG = "WidgetProvider"

class WidgetProvider : AppWidgetProvider() {

override fun onEnabled(context: Context) {
super.onEnabled(context)
scheduleHourlyUpdate(context)
}

override fun onDisabled(context: Context) {
super.onDisabled(context)
cancelHourlyUpdate(context)
}

private fun scheduleHourlyUpdate(context: Context) {
val alarmManager = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager
val intent = Intent(context, AppWidgetProvider::class.java)
intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
val pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT)
alarmManager.setRepeating(
AlarmManager.RTC,
millisecondsUntilNextHour(),
AlarmManager.INTERVAL_HOUR,
pendingIntent
)
}

private fun cancelHourlyUpdate(context: Context) {
val alarmManager = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager
val intent = Intent(context, WidgetProvider::class.java)
val pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT)
alarmManager.cancel(pendingIntent)
}

override fun onUpdate(context: Context, appWidgetManager: AppWidgetManager, appWidgetIds: IntArray) {
val viewModel = (context.applicationContext as BetterApplication).viewModel
for (appWidgetId in appWidgetIds) {
Expand Down

0 comments on commit 231ea37

Please sign in to comment.