From 37c176bed41e09bea868f10cf38fb37eeb016bde Mon Sep 17 00:00:00 2001 From: Daniel Shokouhi Date: Sat, 17 Oct 2020 20:10:05 -0700 Subject: [PATCH] Notification history filter options (#1069) * Add history filter for notifications * Remove command filters and reorganize the history * Clean up category string * Add a missing string, clean up some warnings --- .../database/notification/NotificationDao.kt | 4 +- .../NotificationHistoryFragment.kt | 92 +++++++++++++------ app/src/main/res/drawable/ic_filter.xml | 9 ++ app/src/main/res/values/arrays.xml | 13 +++ app/src/main/res/values/strings.xml | 3 +- app/src/main/res/xml/notifications.xml | 11 ++- 6 files changed, 100 insertions(+), 32 deletions(-) create mode 100644 app/src/main/res/drawable/ic_filter.xml create mode 100644 app/src/main/res/values/arrays.xml diff --git a/app/src/main/java/io/homeassistant/companion/android/database/notification/NotificationDao.kt b/app/src/main/java/io/homeassistant/companion/android/database/notification/NotificationDao.kt index 4cc2a0c7a..28e356d9e 100644 --- a/app/src/main/java/io/homeassistant/companion/android/database/notification/NotificationDao.kt +++ b/app/src/main/java/io/homeassistant/companion/android/database/notification/NotificationDao.kt @@ -17,8 +17,8 @@ interface NotificationDao { @Query("SELECT * FROM notification_history ORDER BY received DESC") fun getAll(): Array? - @Query("SELECT * FROM notification_history ORDER BY received DESC LIMIT 25") - fun getLast25(): Array? + @Query("SELECT * FROM notification_history ORDER BY received DESC LIMIT (:amount)") + fun getLastItems(amount: Int): Array? @Query("DELETE FROM notification_history WHERE id = :id") fun delete(id: Int) diff --git a/app/src/main/java/io/homeassistant/companion/android/settings/notification/NotificationHistoryFragment.kt b/app/src/main/java/io/homeassistant/companion/android/settings/notification/NotificationHistoryFragment.kt index d35f57067..0a494a275 100644 --- a/app/src/main/java/io/homeassistant/companion/android/settings/notification/NotificationHistoryFragment.kt +++ b/app/src/main/java/io/homeassistant/companion/android/settings/notification/NotificationHistoryFragment.kt @@ -2,12 +2,14 @@ package io.homeassistant.companion.android.settings.notification import android.app.AlertDialog import android.os.Bundle +import androidx.preference.DropDownPreference import androidx.preference.Preference import androidx.preference.PreferenceCategory import androidx.preference.PreferenceFragmentCompat import io.homeassistant.companion.android.R import io.homeassistant.companion.android.database.AppDatabase import io.homeassistant.companion.android.database.notification.NotificationDao +import io.homeassistant.companion.android.database.notification.NotificationItem import java.util.Calendar import java.util.GregorianCalendar @@ -27,45 +29,48 @@ class NotificationHistoryFragment : PreferenceFragmentCompat() { super.onResume() val notificationDao = AppDatabase.getInstance(requireContext()).notificationDao() - val notificationList = notificationDao.getLast25() + val notificationList = notificationDao.getLastItems(25) val prefCategory = findPreference("list_notifications") if (!notificationList.isNullOrEmpty()) { prefCategory?.isVisible = true - prefCategory?.removeAll() - for (item in notificationList) { - val pref = Preference(preferenceScreen.context) - val cal: Calendar = GregorianCalendar() - cal.timeInMillis = item.received - pref.key = item.id.toString() - pref.title = cal.time.toString() - pref.summary = item.message - pref.isIconSpaceReserved = false - - pref.setOnPreferenceClickListener { - parentFragmentManager - .beginTransaction() - .replace( - R.id.content, - NotificationDetailFragment.newInstance( - item - ) - ) - .addToBackStack("Notification Detail") - .commit() - return@setOnPreferenceClickListener true - } - - prefCategory?.addPreference(pref) - } + prefCategory?.title = getString(R.string.last_num_notifications, 25) + reloadNotifications(notificationList, prefCategory) findPreference("manage_notifications")?.let { it.isVisible = true } + findPreference("filter_notifications")?.let { + it.isVisible = true + it.setOnPreferenceChangeListener { _, newValue -> + when (newValue) { + "last25" -> { + prefCategory?.title = getString(R.string.last_num_notifications, 25) + reloadNotifications(notificationList, prefCategory) + } + "last50" -> { + val newList = notificationDao.getLastItems(50) + prefCategory?.title = getString(R.string.last_num_notifications, 50) + reloadNotifications(newList, prefCategory) + } + "last100" -> { + val newList = notificationDao.getLastItems(100) + prefCategory?.title = getString(R.string.last_num_notifications, 100) + reloadNotifications(newList, prefCategory) + } + else -> { + prefCategory?.title = getString(R.string.last_num_notifications, 25) + reloadNotifications(notificationList, prefCategory) + } + } + return@setOnPreferenceChangeListener true + } + } + findPreference("delete_all")?.let { it.isVisible = true - it.setOnPreferenceClickListener { _ -> + it.setOnPreferenceClickListener { deleteAllConfirmation(notificationDao) return@setOnPreferenceClickListener true } @@ -106,4 +111,35 @@ class NotificationHistoryFragment : PreferenceFragmentCompat() { val alert: AlertDialog? = builder.create() alert?.show() } + + private fun reloadNotifications(notificationList: Array?, prefCategory: PreferenceCategory?) { + prefCategory?.removeAll() + if (notificationList != null) { + for (item in notificationList) { + val pref = Preference(preferenceScreen.context) + val cal: Calendar = GregorianCalendar() + cal.timeInMillis = item.received + pref.key = item.id.toString() + pref.title = cal.time.toString() + pref.summary = item.message + pref.isIconSpaceReserved = false + + pref.setOnPreferenceClickListener { + parentFragmentManager + .beginTransaction() + .replace( + R.id.content, + NotificationDetailFragment.newInstance( + item + ) + ) + .addToBackStack("Notification Detail") + .commit() + return@setOnPreferenceClickListener true + } + + prefCategory?.addPreference(pref) + } + } + } } diff --git a/app/src/main/res/drawable/ic_filter.xml b/app/src/main/res/drawable/ic_filter.xml new file mode 100644 index 000000000..4610ab033 --- /dev/null +++ b/app/src/main/res/drawable/ic_filter.xml @@ -0,0 +1,9 @@ + + + \ No newline at end of file diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml new file mode 100644 index 000000000..b601ffdd2 --- /dev/null +++ b/app/src/main/res/values/arrays.xml @@ -0,0 +1,13 @@ + + + + Show last 25 notifications + Show last 50 notifications + Show last 100 notifications + + + last25 + last50 + last100 + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 35c94c91a..7620246a5 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -180,8 +180,9 @@ Home Assistant instance History of Notifications (currently displays the last 25 notifications received) Message Notification Received At - Last 25 Notifications + Last %1$d Notifications No Notifications + Filter Notifications You have not received any notifications yet Other Settings Password diff --git a/app/src/main/res/xml/notifications.xml b/app/src/main/res/xml/notifications.xml index 2c879f24c..9cace85fb 100644 --- a/app/src/main/res/xml/notifications.xml +++ b/app/src/main/res/xml/notifications.xml @@ -15,6 +15,15 @@ android:title="@string/manage_all_notifications" app:isPreferenceVisible="false" app:iconSpaceReserved="false"> + \ No newline at end of file