properly update the widget every new minute

This commit is contained in:
tibbi 2018-03-12 18:53:38 +01:00
parent 95a66b8a75
commit 8d8d98e88d
9 changed files with 74 additions and 25 deletions

View File

@ -84,6 +84,8 @@
<receiver android:name=".receivers.TimerReceiver"/>
<receiver android:name=".receivers.DateTimeWidgetUpdateReceiver"/>
<receiver android:name=".receivers.BootCompletedReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>

View File

@ -10,8 +10,8 @@ import com.simplemobiletools.clock.R
import com.simplemobiletools.clock.extensions.config
import com.simplemobiletools.clock.extensions.getFormattedDate
import com.simplemobiletools.clock.extensions.getFormattedTime
import com.simplemobiletools.clock.extensions.getPassedSeconds
import com.simplemobiletools.clock.helpers.MyWidgetDateTimeProvider
import com.simplemobiletools.clock.helpers.getPassedSeconds
import com.simplemobiletools.commons.dialogs.ColorPickerDialog
import com.simplemobiletools.commons.extensions.adjustAlpha
import kotlinx.android.synthetic.main.widget_config_date_time.*
@ -73,7 +73,7 @@ class WidgetDateTimeConfigureActivity : SimpleActivity() {
private fun updateCurrentDateTime() {
val calendar = Calendar.getInstance()
config_time.text = getFormattedTime(getPassedSeconds(), false)
config_time.text = getPassedSeconds().getFormattedTime(false)
config_date.text = getFormattedDate(calendar)
if (config.useTextShadow) {

View File

@ -17,8 +17,10 @@ import com.simplemobiletools.clock.models.Alarm
import com.simplemobiletools.clock.models.AlarmSound
import com.simplemobiletools.clock.models.MyTimeZone
import com.simplemobiletools.clock.receivers.AlarmReceiver
import com.simplemobiletools.clock.receivers.DateTimeWidgetUpdateReceiver
import com.simplemobiletools.commons.extensions.formatMinutesToTimeString
import com.simplemobiletools.commons.extensions.toast
import com.simplemobiletools.commons.helpers.isKitkatPlus
import com.simplemobiletools.commons.helpers.isLollipopPlus
import java.util.*
import kotlin.math.pow
@ -38,26 +40,6 @@ fun Context.getFormattedDate(calendar: Calendar): String {
return "$shortDayString, $dayOfMonth $monthString"
}
fun Context.getPassedSeconds(): Int {
val calendar = Calendar.getInstance()
val offset = calendar.timeZone.rawOffset
return ((calendar.timeInMillis + offset) / 1000).toInt()
}
fun Context.getFormattedTime(passedSeconds: Int, showSeconds: Boolean): String {
val hours = (passedSeconds / 3600) % 24
val minutes = (passedSeconds / 60) % 60
val seconds = passedSeconds % 60
var format = "%02d:%02d"
return if (showSeconds) {
format += ":%02d"
String.format(format, hours, minutes, seconds)
} else {
String.format(format, hours, minutes)
}
}
fun Context.getEditedTimeZonesMap(): HashMap<Int, String> {
val editedTimeZoneTitles = config.editedTimeZoneTitles
val editedTitlesMap = HashMap<Int, String>()
@ -173,3 +155,21 @@ fun Context.updateWidgets() {
}
}
}
@SuppressLint("NewApi")
fun Context.scheduleNextWidgetUpdate() {
val widgetsCnt = AppWidgetManager.getInstance(applicationContext).getAppWidgetIds(ComponentName(applicationContext, MyWidgetDateTimeProvider::class.java))
if (widgetsCnt.isEmpty()) {
return
}
val intent = Intent(this, DateTimeWidgetUpdateReceiver::class.java)
val pendingIntent = PendingIntent.getBroadcast(this, UPDATE_WIDGET_INTENT_ID, intent, PendingIntent.FLAG_UPDATE_CURRENT)
val alarmManager = getSystemService(Context.ALARM_SERVICE) as AlarmManager
val triggerAtMillis = System.currentTimeMillis() + getMSTillNextMinute()
when {
isKitkatPlus() -> alarmManager.setExact(AlarmManager.RTC, triggerAtMillis, pendingIntent)
else -> alarmManager.set(AlarmManager.RTC, triggerAtMillis, pendingIntent)
}
}

View File

@ -6,3 +6,17 @@ fun Int.formatAlarmTime(): String {
val format = "%02d:%02d"
return String.format(format, hours, minutes)
}
fun Int.getFormattedTime(showSeconds: Boolean): String {
val hours = (this / 3600) % 24
val minutes = (this / 60) % 60
val seconds = this % 60
var format = "%02d:%02d"
return if (showSeconds) {
format += ":%02d"
String.format(format, hours, minutes, seconds)
} else {
String.format(format, hours, minutes)
}
}

View File

@ -76,7 +76,7 @@ class ClockFragment : Fragment() {
val hours = (passedSeconds / 3600) % 24
val minutes = (passedSeconds / 60) % 60
val seconds = passedSeconds % 60
view.clock_time.text = context!!.getFormattedTime(passedSeconds, context!!.config.showSeconds)
view.clock_time.text = passedSeconds.getFormattedTime(context!!.config.showSeconds)
if (seconds == 0) {
if (hours == 0 && minutes == 0) {

View File

@ -1,6 +1,7 @@
package com.simplemobiletools.clock.helpers
import com.simplemobiletools.clock.models.MyTimeZone
import java.util.*
// shared preferences
const val SHOW_SECONDS = "show_seconds"
@ -23,6 +24,7 @@ const val DAY_MINUTES = 1440
const val DEFAULT_MAX_ALARM_REMINDER_SECS = 300
const val DEFAULT_MAX_TIMER_REMINDER_SECS = 60
const val UPDATE_WIDGET_INTENT_ID = 9997
const val OPEN_APP_INTENT_ID = 9998
const val TIMER_NOTIF_ID = 9999
@ -38,6 +40,17 @@ const val SORT_BY_TOTAL_TIME = 4
fun getDefaultTimeZoneTitle(id: Int) = getAllTimeZones().firstOrNull { it.id == id }?.title ?: ""
fun getMSTillNextMinute(): Long {
val calendar = Calendar.getInstance()
return 60000L - calendar.get(Calendar.MILLISECOND) - calendar.get(Calendar.SECOND) * 1000
}
fun getPassedSeconds(): Int {
val calendar = Calendar.getInstance()
val offset = calendar.timeZone.rawOffset
return ((calendar.timeInMillis + offset) / 1000).toInt()
}
fun getAllTimeZones() = arrayListOf(
MyTimeZone(1, "GMT-11:00 Midway", "Pacific/Midway"),
MyTimeZone(2, "GMT-10:00 Honolulu", "Pacific/Honolulu"),

View File

@ -12,6 +12,7 @@ import com.simplemobiletools.clock.activities.SplashActivity
import com.simplemobiletools.clock.extensions.config
import com.simplemobiletools.clock.extensions.getFormattedDate
import com.simplemobiletools.clock.extensions.getFormattedTime
import com.simplemobiletools.clock.extensions.scheduleNextWidgetUpdate
import com.simplemobiletools.commons.extensions.setBackgroundColor
import com.simplemobiletools.commons.extensions.setText
import java.util.*
@ -22,6 +23,11 @@ class MyWidgetDateTimeProvider : AppWidgetProvider() {
performUpdate(context)
}
override fun onEnabled(context: Context) {
super.onEnabled(context)
context.scheduleNextWidgetUpdate()
}
private fun performUpdate(context: Context) {
val appWidgetManager = AppWidgetManager.getInstance(context)
appWidgetManager.getAppWidgetIds(getComponentName(context)).forEach {
@ -38,7 +44,7 @@ class MyWidgetDateTimeProvider : AppWidgetProvider() {
private fun updateTexts(context: Context, views: RemoteViews) {
val calendar = Calendar.getInstance()
views.apply {
setText(R.id.widget_time, context.getFormattedTime(context.getPassedSeconds(), false))
setText(R.id.widget_time, getPassedSeconds().getFormattedTime(false))
setText(R.id.widget_date, context.getFormattedDate(calendar))
}
}

View File

@ -0,0 +1,14 @@
package com.simplemobiletools.clock.receivers
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import com.simplemobiletools.clock.extensions.scheduleNextWidgetUpdate
import com.simplemobiletools.clock.extensions.updateWidgets
class DateTimeWidgetUpdateReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
context.updateWidgets()
context.scheduleNextWidgetUpdate()
}
}

View File

@ -6,4 +6,4 @@
android:minHeight="@dimen/min_widget_height"
android:minWidth="@dimen/min_widget_width"
android:resizeMode="horizontal|vertical"
android:updatePeriodMillis="60000"/>
android:updatePeriodMillis="86400000"/>