diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index b96e69d5..eccfdddd 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -84,6 +84,8 @@
+
+
diff --git a/app/src/main/kotlin/com/simplemobiletools/clock/activities/WidgetDateTimeConfigureActivity.kt b/app/src/main/kotlin/com/simplemobiletools/clock/activities/WidgetDateTimeConfigureActivity.kt
index 1a229b98..4920d8e8 100644
--- a/app/src/main/kotlin/com/simplemobiletools/clock/activities/WidgetDateTimeConfigureActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/clock/activities/WidgetDateTimeConfigureActivity.kt
@@ -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) {
diff --git a/app/src/main/kotlin/com/simplemobiletools/clock/extensions/Context.kt b/app/src/main/kotlin/com/simplemobiletools/clock/extensions/Context.kt
index 86e00d65..6264cdd6 100644
--- a/app/src/main/kotlin/com/simplemobiletools/clock/extensions/Context.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/clock/extensions/Context.kt
@@ -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 {
val editedTimeZoneTitles = config.editedTimeZoneTitles
val editedTitlesMap = HashMap()
@@ -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)
+ }
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/clock/extensions/Int.kt b/app/src/main/kotlin/com/simplemobiletools/clock/extensions/Int.kt
index 4c20cf97..5e0bb7e4 100644
--- a/app/src/main/kotlin/com/simplemobiletools/clock/extensions/Int.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/clock/extensions/Int.kt
@@ -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)
+ }
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/clock/fragments/ClockFragment.kt b/app/src/main/kotlin/com/simplemobiletools/clock/fragments/ClockFragment.kt
index 944e21d6..275200d6 100644
--- a/app/src/main/kotlin/com/simplemobiletools/clock/fragments/ClockFragment.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/clock/fragments/ClockFragment.kt
@@ -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) {
diff --git a/app/src/main/kotlin/com/simplemobiletools/clock/helpers/Constants.kt b/app/src/main/kotlin/com/simplemobiletools/clock/helpers/Constants.kt
index a1565de2..31e56c3a 100644
--- a/app/src/main/kotlin/com/simplemobiletools/clock/helpers/Constants.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/clock/helpers/Constants.kt
@@ -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"),
diff --git a/app/src/main/kotlin/com/simplemobiletools/clock/helpers/MyWidgetDateTimeProvider.kt b/app/src/main/kotlin/com/simplemobiletools/clock/helpers/MyWidgetDateTimeProvider.kt
index bf1c2e0a..62d98d3c 100644
--- a/app/src/main/kotlin/com/simplemobiletools/clock/helpers/MyWidgetDateTimeProvider.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/clock/helpers/MyWidgetDateTimeProvider.kt
@@ -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))
}
}
diff --git a/app/src/main/kotlin/com/simplemobiletools/clock/receivers/DateTimeWidgetUpdateReceiver.kt b/app/src/main/kotlin/com/simplemobiletools/clock/receivers/DateTimeWidgetUpdateReceiver.kt
new file mode 100644
index 00000000..eeeb2c79
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/clock/receivers/DateTimeWidgetUpdateReceiver.kt
@@ -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()
+ }
+}
diff --git a/app/src/main/res/xml/widget_date_time_info.xml b/app/src/main/res/xml/widget_date_time_info.xml
index 95cb1f32..32e25ba6 100644
--- a/app/src/main/res/xml/widget_date_time_info.xml
+++ b/app/src/main/res/xml/widget_date_time_info.xml
@@ -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"/>