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"/>