mirror of
https://github.com/SimpleMobileTools/Simple-Clock.git
synced 2025-02-20 22:00:45 +01:00
properly update the widget every new minute
This commit is contained in:
parent
95a66b8a75
commit
8d8d98e88d
@ -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"/>
|
||||
|
@ -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) {
|
||||
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
@ -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) {
|
||||
|
@ -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"),
|
||||
|
@ -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))
|
||||
}
|
||||
}
|
||||
|
@ -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()
|
||||
}
|
||||
}
|
@ -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"/>
|
||||
|
Loading…
x
Reference in New Issue
Block a user