From 630361849c31051e136b9044fa2c12d390877393 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kuba=20Szczodrzy=C5=84ski?= Date: Sun, 8 Mar 2020 17:22:14 +0100 Subject: [PATCH] [Notifications] Implement Quiet hours. Add missing timetable manual strings. --- .../szczodrzynski/edziennik/config/Config.kt | 2 +- .../edziennik/config/ConfigSync.kt | 20 ++++--- .../config/utils/AppConfigMigrationV3.kt | 21 ++++++- .../edziennik/config/utils/ConfigMigration.kt | 27 ++++++++- .../data/api/task/PostNotifications.kt | 59 ++++++++++--------- .../modules/settings/SettingsNewFragment.java | 42 +++++++------ app/src/main/res/values/strings.xml | 12 ++++ 7 files changed, 119 insertions(+), 64 deletions(-) diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/config/Config.kt b/app/src/main/java/pl/szczodrzynski/edziennik/config/Config.kt index 4e7a4c23..0b10c35b 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/config/Config.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/config/Config.kt @@ -22,7 +22,7 @@ import kotlin.coroutines.CoroutineContext class Config(val db: AppDb) : CoroutineScope, AbstractConfig { companion object { - const val DATA_VERSION = 10 + const val DATA_VERSION = 11 } private val job = Job() diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/config/ConfigSync.kt b/app/src/main/java/pl/szczodrzynski/edziennik/config/ConfigSync.kt index 808b7893..d8d5ccb5 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/config/ConfigSync.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/config/ConfigSync.kt @@ -7,6 +7,7 @@ package pl.szczodrzynski.edziennik.config import pl.szczodrzynski.edziennik.config.utils.get import pl.szczodrzynski.edziennik.config.utils.getIntList import pl.szczodrzynski.edziennik.config.utils.set +import pl.szczodrzynski.edziennik.utils.models.Time class ConfigSync(private val config: Config) { private var mDontShowAppManagerDialog: Boolean? = null @@ -40,14 +41,19 @@ class ConfigSync(private val config: Config) { | | | | | | | |/ _ \ __| | '_ \ / _ \| | | | '__/ __| | |__| | |_| | | __/ |_ | | | | (_) | |_| | | \__ \ \___\_\\__,_|_|\___|\__| |_| |_|\___/ \__,_|_| |__*/ - private var mQuietHoursStart: Long? = null - var quietHoursStart: Long - get() { mQuietHoursStart = mQuietHoursStart ?: config.values.get("quietHoursStart", 0L); return mQuietHoursStart ?: 0L } + private var mQuietHoursEnabled: Boolean? = null + var quietHoursEnabled: Boolean + get() { mQuietHoursEnabled = mQuietHoursEnabled ?: config.values.get("quietHoursEnabled", false); return mQuietHoursEnabled ?: false } + set(value) { config.set("quietHoursEnabled", value); mQuietHoursEnabled = value } + + private var mQuietHoursStart: Time? = null + var quietHoursStart: Time? + get() { mQuietHoursStart = mQuietHoursStart ?: config.values.get("quietHoursStart", null as Time?); return mQuietHoursStart } set(value) { config.set("quietHoursStart", value); mQuietHoursStart = value } - private var mQuietHoursEnd: Long? = null - var quietHoursEnd: Long - get() { mQuietHoursEnd = mQuietHoursEnd ?: config.values.get("quietHoursEnd", 0L); return mQuietHoursEnd ?: 0L } + private var mQuietHoursEnd: Time? = null + var quietHoursEnd: Time? + get() { mQuietHoursEnd = mQuietHoursEnd ?: config.values.get("quietHoursEnd", null as Time?); return mQuietHoursEnd } set(value) { config.set("quietHoursEnd", value); mQuietHoursEnd = value } private var mQuietDuringLessons: Boolean? = null @@ -90,4 +96,4 @@ class ConfigSync(private val config: Config) { var tokenVulcanList: List get() { mTokenVulcanList = mTokenVulcanList ?: config.values.getIntList("tokenVulcanList", listOf()); return mTokenVulcanList ?: listOf() } set(value) { config.set("tokenVulcanList", value); mTokenVulcanList = value } -} \ No newline at end of file +} diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/config/utils/AppConfigMigrationV3.kt b/app/src/main/java/pl/szczodrzynski/edziennik/config/utils/AppConfigMigrationV3.kt index 6c2fa19c..78a1d8a6 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/config/utils/AppConfigMigrationV3.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/config/utils/AppConfigMigrationV3.kt @@ -14,6 +14,7 @@ import pl.szczodrzynski.edziennik.data.api.LOGIN_TYPE_LIBRUS import pl.szczodrzynski.edziennik.data.api.LOGIN_TYPE_MOBIDZIENNIK import pl.szczodrzynski.edziennik.data.api.LOGIN_TYPE_VULCAN import pl.szczodrzynski.edziennik.utils.models.Time +import kotlin.math.abs class AppConfigMigrationV3(p: SharedPreferences, config: Config) { init { config.apply { @@ -42,9 +43,7 @@ class AppConfigMigrationV3(p: SharedPreferences, config: Config) { devModePassword = p.getString("$s.devModePassword", null).fix() sync.tokenApp = p.getString("$s.fcmToken", null).fix() timetable.bellSyncMultiplier = p.getString("$s.bellSyncMultiplier", null)?.toIntOrNull() ?: 0 - sync.quietHoursStart = p.getString("$s.quietHoursStart", null)?.toLongOrNull() ?: 0 appRateSnackbarTime = p.getString("$s.appRateSnackbarTime", null)?.toLongOrNull() ?: 0 - sync.quietHoursEnd = p.getString("$s.quietHoursEnd", null)?.toLongOrNull() ?: 0 timetable.countInSeconds = p.getString("$s.countInSeconds", null)?.toBoolean() ?: false ui.headerBackground = p.getString("$s.headerBackground", null).fix() ui.appBackground = p.getString("$s.appBackground", null).fix() @@ -59,6 +58,22 @@ class AppConfigMigrationV3(p: SharedPreferences, config: Config) { sync.notifyAboutUpdates = p.getString("$s.notifyAboutUpdates", null)?.toBoolean() ?: true timetable.bellSyncDiff = p.getString("$s.bellSyncDiff", null)?.let { Gson().fromJson(it, Time::class.java) } + val startMillis = p.getString("$s.quietHoursStart", null)?.toLongOrNull() ?: 0 + val endMillis = p.getString("$s.quietHoursEnd", null)?.toLongOrNull() ?: 0 + if (startMillis > 0) { + try { + sync.quietHoursStart = Time.fromMillis(abs(startMillis)) + sync.quietHoursEnd = Time.fromMillis(abs(endMillis)) + sync.quietHoursEnabled = true + } + catch (_: Exception) {} + } + else { + sync.quietHoursEnabled = false + sync.quietHoursStart = null + sync.quietHoursEnd = null + } + sync.tokenMobidziennikList = listOf() sync.tokenVulcanList = listOf() sync.tokenLibrusList = listOf() @@ -78,4 +93,4 @@ class AppConfigMigrationV3(p: SharedPreferences, config: Config) { private fun String?.fix(): String? { return this?.replace("\"", "")?.let { if (it == "null") null else it } } -} \ No newline at end of file +} diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/config/utils/ConfigMigration.kt b/app/src/main/java/pl/szczodrzynski/edziennik/config/utils/ConfigMigration.kt index 91951e49..a30c996a 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/config/utils/ConfigMigration.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/config/utils/ConfigMigration.kt @@ -11,6 +11,8 @@ import pl.szczodrzynski.edziennik.HOUR import pl.szczodrzynski.edziennik.MainActivity import pl.szczodrzynski.edziennik.config.Config import pl.szczodrzynski.edziennik.utils.managers.GradesManager.Companion.ORDER_BY_DATE_DESC +import pl.szczodrzynski.edziennik.utils.models.Time +import kotlin.math.abs class ConfigMigration(app: App, config: Config) { init { config.apply { @@ -43,8 +45,9 @@ class ConfigMigration(app: App, config: Config) { sync.interval = 1*HOUR.toInt() sync.notifyAboutUpdates = true sync.onlyWifi = false - sync.quietHoursStart = 0 - sync.quietHoursEnd = 0 + sync.quietHoursEnabled = false + sync.quietHoursStart = null + sync.quietHoursEnd = null sync.quietDuringLessons = false sync.tokenApp = null sync.tokenMobidziennik = null @@ -69,5 +72,25 @@ class ConfigMigration(app: App, config: Config) { dataVersion = 10 } + + if (dataVersion < 11) { + val startMillis = config.values.get("quietHoursStart", 0L) + val endMillis = config.values.get("quietHoursEnd", 0L) + if (startMillis > 0) { + try { + sync.quietHoursStart = Time.fromMillis(abs(startMillis)) + sync.quietHoursEnd = Time.fromMillis(abs(endMillis)) + sync.quietHoursEnabled = true + } + catch (_: Exception) {} + } + else { + sync.quietHoursEnabled = false + sync.quietHoursStart = null + sync.quietHoursEnd = null + } + + dataVersion = 11 + } }} } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/task/PostNotifications.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/task/PostNotifications.kt index d7caa776..843f2174 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/task/PostNotifications.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/task/PostNotifications.kt @@ -10,6 +10,7 @@ import androidx.core.util.forEach import androidx.core.util.set import pl.szczodrzynski.edziennik.* import pl.szczodrzynski.edziennik.data.db.entity.Notification.Companion.TYPE_SERVER_MESSAGE +import pl.szczodrzynski.edziennik.utils.models.Time import pl.szczodrzynski.edziennik.data.db.entity.Notification as AppNotification class PostNotifications(val app: App, nList: List) { @@ -17,22 +18,34 @@ class PostNotifications(val app: App, nList: List) { private const val TAG = "PostNotifications" } - /*public boolean shouldBeQuiet() { - long now = Time.getNow().getInMillis(); - long start = app.config.getSync().getQuietHoursStart(); - long end = app.config.getSync().getQuietHoursEnd(); + private val quiet by lazy { shouldBeQuiet() } + fun shouldBeQuiet(): Boolean { + if (!app.config.sync.quietHoursEnabled) + return false + val now = Time.getNow().value + val start = app.config.sync.quietHoursStart?.value ?: return false + var end = app.config.sync.quietHoursEnd?.value ?: return false if (start > end) { - end += 1000 * 60 * 60 * 24; - //Log.d(TAG, "Night passing"); + // the range spans between two days + end += 240000 } - if (start > now) { - now += 1000 * 60 * 60 * 24; - //Log.d(TAG, "Now is smaller"); - } - //Log.d(TAG, "Start is "+start+", now is "+now+", end is "+end); - return start > 0 && now >= start && now <= end; - }*/ - fun shouldBeQuiet() = false + return now in start..end || now+240000 in start..end + } + + private fun NotificationCompat.Builder.addDefaults(): NotificationCompat.Builder { + return this.setColor(0xff2196f3.toInt()) + .setLights(0xff2196f3.toInt(), 2000, 2000) + .setPriority(if (quiet) NotificationCompat.PRIORITY_LOW else NotificationCompat.PRIORITY_MAX) + .also { + if (quiet) { + it.setSound(null) + it.setVibrate(longArrayOf()) + } + else + it.setDefaults(NotificationCompat.DEFAULT_ALL) + } + .setGroup(if (quiet) app.notificationChannelsManager.dataQuiet.key else app.notificationChannelsManager.data.key) + } private fun buildSummaryText(summaryCounts: SparseIntArray): CharSequence { val summaryTexts = mutableListOf() @@ -108,11 +121,7 @@ class PostNotifications(val app: App, nList: List) { it.addLine(line) } }) - .setColor(0xff2196f3.toInt()) - .setLights(0xff2196f3.toInt(), 2000, 2000) - .setPriority(NotificationCompat.PRIORITY_MAX) - .setDefaults(NotificationCompat.DEFAULT_ALL) - .setGroup(app.notificationChannelsManager.data.key) + .addDefaults() .setContentIntent(summaryIntent) .setAutoCancel(true) .build() @@ -131,11 +140,7 @@ class PostNotifications(val app: App, nList: List) { .setStyle(NotificationCompat.BigTextStyle() .bigText(it.text)) .setWhen(it.addedDate) - .setColor(0xff2196f3.toInt()) - .setLights(0xff2196f3.toInt(), 2000, 2000) - .setPriority(NotificationCompat.PRIORITY_MAX) - .setDefaults(NotificationCompat.DEFAULT_ALL) - .setGroup(app.notificationChannelsManager.data.key) + .addDefaults() .setGroupAlertBehavior(NotificationCompat.GROUP_ALERT_SUMMARY) .setContentIntent(it.getPendingIntent(app)) .setAutoCancel(true) @@ -155,11 +160,7 @@ class PostNotifications(val app: App, nList: List) { .setContentText(buildSummaryText(summaryCounts)) .setTicker(newNotificationsText) .setSmallIcon(R.drawable.ic_notification) - .setColor(0xff2196f3.toInt()) - .setLights(0xff2196f3.toInt(), 2000, 2000) - .setPriority(NotificationCompat.PRIORITY_MAX) - .setDefaults(NotificationCompat.DEFAULT_ALL) - .setGroup(app.notificationChannelsManager.data.key) + .addDefaults() .setGroupSummary(true) .setContentIntent(summaryIntent) .setAutoCancel(true) diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/settings/SettingsNewFragment.java b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/settings/SettingsNewFragment.java index 58b67473..b8a25947 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/settings/SettingsNewFragment.java +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/settings/SettingsNewFragment.java @@ -523,10 +523,12 @@ public class SettingsNewFragment extends MaterialAboutFragment { ); } private String getSyncCardQuietHoursSubText() { + if (app.getConfig().getSync().getQuietHoursStart() == null || app.getConfig().getSync().getQuietHoursEnd() == null) + return ""; return getString( - app.getConfig().getSync().getQuietHoursStart() >= app.getConfig().getSync().getQuietHoursEnd() ? R.string.settings_sync_quiet_hours_subtext_next_day_format : R.string.settings_sync_quiet_hours_subtext_format, - Time.fromMillis(Math.abs(app.getConfig().getSync().getQuietHoursStart())).getStringHM(), - Time.fromMillis(app.getConfig().getSync().getQuietHoursEnd()).getStringHM() + app.getConfig().getSync().getQuietHoursStart().getValue() >= app.getConfig().getSync().getQuietHoursEnd().getValue() ? R.string.settings_sync_quiet_hours_subtext_next_day_format : R.string.settings_sync_quiet_hours_subtext_format, + app.getConfig().getSync().getQuietHoursStart().getStringHM(), + app.getConfig().getSync().getQuietHoursEnd().getStringHM() ); } private MaterialAboutItem getSyncCardWifiItem() { @@ -650,7 +652,7 @@ public class SettingsNewFragment extends MaterialAboutFragment { .size(IconicsSize.dp(iconSizeDp)) .color(IconicsColor.colorInt(iconColor)) ); - syncCardQuietHoursItem.setChecked(app.getConfig().getSync().getQuietHoursStart() > 0); + syncCardQuietHoursItem.setChecked(app.getConfig().getSync().getQuietHoursEnabled()); syncCardQuietHoursItem.setSubTextChecked(getSyncCardQuietHoursSubText()); syncCardQuietHoursItem.setOnClickAction(() -> { new MaterialDialog.Builder(activity) @@ -662,10 +664,12 @@ public class SettingsNewFragment extends MaterialAboutFragment { .itemsCallback((dialog, itemView, position, text) -> { if (position == 0) { // set beginning - Time time = Time.fromMillis(Math.abs(app.getConfig().getSync().getQuietHoursStart())); + Time time = app.getConfig().getSync().getQuietHoursStart(); + if (time == null) + time = new Time(22, 30, 0); TimePickerDialog.newInstance((v2, hourOfDay, minute, second) -> { - // if it's disabled, it'll be enabled automatically - app.getConfig().getSync().setQuietHoursStart(new Time(hourOfDay, minute, second).getInMillis()); + app.getConfig().getSync().setQuietHoursEnabled(true); + app.getConfig().getSync().setQuietHoursStart(new Time(hourOfDay, minute, second)); syncCardQuietHoursItem.setChecked(true); syncCardQuietHoursItem.setSubTextChecked(getSyncCardQuietHoursSubText()); refreshMaterialAboutList(); @@ -673,13 +677,12 @@ public class SettingsNewFragment extends MaterialAboutFragment { } else { // set end - Time time = Time.fromMillis(app.getConfig().getSync().getQuietHoursEnd()); + Time time = app.getConfig().getSync().getQuietHoursEnd(); + if (time == null) + time = new Time(5, 30, 0); TimePickerDialog.newInstance((v2, hourOfDay, minute, second) -> { - if (app.getConfig().getSync().getQuietHoursStart() < 0) { - // if it's disabled, enable - app.getConfig().getSync().setQuietHoursStart(-1 * app.getConfig().getSync().getQuietHoursStart()); - } - app.getConfig().getSync().setQuietHoursEnd(new Time(hourOfDay, minute, second).getInMillis()); + app.getConfig().getSync().setQuietHoursEnabled(true); + app.getConfig().getSync().setQuietHoursEnd(new Time(hourOfDay, minute, second)); syncCardQuietHoursItem.setChecked(true); syncCardQuietHoursItem.setSubTextChecked(getSyncCardQuietHoursSubText()); refreshMaterialAboutList(); @@ -689,15 +692,10 @@ public class SettingsNewFragment extends MaterialAboutFragment { .show(); }); syncCardQuietHoursItem.setOnChangeAction((isChecked, tag) -> { - if (isChecked && app.getConfig().getSync().getQuietHoursStart() < 0) { - app.getConfig().getSync().setQuietHoursStart(app.getConfig().getSync().getQuietHoursStart() * -1); - } - else if (!isChecked && app.getConfig().getSync().getQuietHoursStart() > 0) { - app.getConfig().getSync().setQuietHoursStart(app.getConfig().getSync().getQuietHoursStart() * -1); - } - else if (isChecked && app.getConfig().getSync().getQuietHoursStart() == 0) { - app.getConfig().getSync().setQuietHoursStart(new Time(22, 30, 0).getInMillis()); - app.getConfig().getSync().setQuietHoursEnd(new Time(5, 30, 0).getInMillis()); + app.getConfig().getSync().setQuietHoursEnabled(isChecked); + if (isChecked && app.getConfig().getSync().getQuietHoursStart() == null) { + app.getConfig().getSync().setQuietHoursStart(new Time(22, 30, 0)); + app.getConfig().getSync().setQuietHoursEnd(new Time(5, 30, 0)); syncCardQuietHoursItem.setSubTextChecked(getSyncCardQuietHoursSubText()); refreshMaterialAboutList(); } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 1e2235e0..a50d00fe 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1237,4 +1237,16 @@ Własny przedmiot Wybierz datę Nie ma więcej lekcji tego przedmiotu. Pobierz plan lekcji i spróbuj ponownie. + Data + Wybierz datę + Wybierz przedmiot + Godzina + Wybierz godzinę + %s (lekcja %d) + Nie dodano własnych lekcji na ten dzień. + Na każdej lekcji przedmiotu %s + Obejmuje plan lekcji na każdy tydzień + Wg. przedmiotu + Jednorazowo + Cyklicznie