From c620bbabd233ffc91635743261844549aac0a878 Mon Sep 17 00:00:00 2001 From: Daniel Shokouhi Date: Thu, 15 Oct 2020 17:49:00 -0700 Subject: [PATCH] Allow notifications from history to be deleted one at a time or all at once (#1058) --- .../NotificationDetailFragment.kt | 37 ++++++++++++ .../NotificationHistoryFragment.kt | 59 +++++++++++++++++-- app/src/main/res/drawable/ic_delete.xml | 9 +++ app/src/main/res/drawable/ic_ringer_mute.xml | 9 +++ app/src/main/res/values/strings.xml | 10 ++++ app/src/main/res/xml/notification_detail.xml | 9 +++ app/src/main/res/xml/notifications.xml | 30 ++++++++-- 7 files changed, 151 insertions(+), 12 deletions(-) create mode 100644 app/src/main/res/drawable/ic_delete.xml create mode 100644 app/src/main/res/drawable/ic_ringer_mute.xml diff --git a/app/src/main/java/io/homeassistant/companion/android/settings/notification/NotificationDetailFragment.kt b/app/src/main/java/io/homeassistant/companion/android/settings/notification/NotificationDetailFragment.kt index a40b0388b..df1e75d0c 100644 --- a/app/src/main/java/io/homeassistant/companion/android/settings/notification/NotificationDetailFragment.kt +++ b/app/src/main/java/io/homeassistant/companion/android/settings/notification/NotificationDetailFragment.kt @@ -4,6 +4,7 @@ import android.os.Bundle import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat import io.homeassistant.companion.android.R +import io.homeassistant.companion.android.database.AppDatabase import io.homeassistant.companion.android.database.notification.NotificationItem import java.util.Calendar import java.util.GregorianCalendar @@ -24,6 +25,7 @@ class NotificationDetailFragment( override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { addPreferencesFromResource(R.xml.notification_detail) + findPreference("received_at")?.let { val cal: Calendar = GregorianCalendar() cal.timeInMillis = notification.received @@ -37,5 +39,40 @@ class NotificationDetailFragment( findPreference("data")?.let { it.summary = notification.data } + + findPreference("delete_notification")?.let { + it.setOnPreferenceClickListener { + + deleteConfirmation() + + return@setOnPreferenceClickListener true + } + } + } + + private fun deleteConfirmation() { + val notificationDao = AppDatabase.getInstance(requireContext()).notificationDao() + + val builder: android.app.AlertDialog.Builder = android.app.AlertDialog.Builder(requireContext()) + + builder.setTitle(R.string.confirm_delete_this_notification_title) + builder.setMessage(R.string.confirm_delete_this_notification_message) + + builder.setPositiveButton( + R.string.confirm_positive + ) { dialog, _ -> + notificationDao.delete(notification.id) + dialog.dismiss() + parentFragmentManager.popBackStack() + } + + builder.setNegativeButton( + R.string.confirm_negative + ) { dialog, _ -> // Do nothing + dialog.dismiss() + } + + val alert: android.app.AlertDialog? = builder.create() + alert?.show() } } 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 63368a2b0..d35f57067 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 @@ -1,11 +1,13 @@ package io.homeassistant.companion.android.settings.notification +import android.app.AlertDialog import android.os.Bundle 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 java.util.Calendar import java.util.GregorianCalendar @@ -18,16 +20,19 @@ class NotificationHistoryFragment : PreferenceFragmentCompat() { } override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { - setPreferencesFromResource(R.xml.notifications, rootKey) + } + + override fun onResume() { + super.onResume() + val notificationDao = AppDatabase.getInstance(requireContext()).notificationDao() val notificationList = notificationDao.getLast25() - val prefCategory = PreferenceCategory(preferenceScreen.context) + val prefCategory = findPreference("list_notifications") if (!notificationList.isNullOrEmpty()) { - prefCategory.title = requireContext().getString(R.string.last_25_notifications) - prefCategory.isIconSpaceReserved = false - preferenceScreen.addPreference(prefCategory) + prefCategory?.isVisible = true + prefCategory?.removeAll() for (item in notificationList) { val pref = Preference(preferenceScreen.context) val cal: Calendar = GregorianCalendar() @@ -51,12 +56,54 @@ class NotificationHistoryFragment : PreferenceFragmentCompat() { return@setOnPreferenceClickListener true } - prefCategory.addPreference(pref) + prefCategory?.addPreference(pref) + } + + findPreference("manage_notifications")?.let { + it.isVisible = true + } + + findPreference("delete_all")?.let { + it.isVisible = true + it.setOnPreferenceClickListener { _ -> + deleteAllConfirmation(notificationDao) + return@setOnPreferenceClickListener true + } } } else { + findPreference("manage_notifications")?.let { + it.isVisible = false + } + findPreference("list_notifications")?.let { + it.isVisible = false + } findPreference("no_notifications")?.let { it.isVisible = true } } } + + private fun deleteAllConfirmation(notificationDao: NotificationDao) { + val builder: AlertDialog.Builder = AlertDialog.Builder(requireContext()) + + builder.setTitle(R.string.confirm_delete_all_notification_title) + builder.setMessage(R.string.confirm_delete_all_notification_message) + + builder.setPositiveButton( + R.string.confirm_positive + ) { dialog, _ -> + notificationDao.deleteAll() + dialog.dismiss() + parentFragmentManager.popBackStack() + } + + builder.setNegativeButton( + R.string.confirm_negative + ) { dialog, _ -> // Do nothing + dialog.dismiss() + } + + val alert: AlertDialog? = builder.create() + alert?.show() + } } diff --git a/app/src/main/res/drawable/ic_delete.xml b/app/src/main/res/drawable/ic_delete.xml new file mode 100644 index 000000000..0eb8f0e7a --- /dev/null +++ b/app/src/main/res/drawable/ic_delete.xml @@ -0,0 +1,9 @@ + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_ringer_mute.xml b/app/src/main/res/drawable/ic_ringer_mute.xml new file mode 100644 index 000000000..83cd0b72f --- /dev/null +++ b/app/src/main/res/drawable/ic_ringer_mute.xml @@ -0,0 +1,9 @@ + + + \ 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 39693590c..35c94c91a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -167,6 +167,16 @@ Home Assistant instance Failed to send event on notification dismissed Full Notification Data Notification History + Manage All Notifications + Manage This Notification + Delete all notifications from history + Delete this notification from history + Confirm deleting this notification + Are you sure? This cannot be undone + Confirm deleting all notifications + Are you sure? This cannot be undone + YES + NO History of Notifications (currently displays the last 25 notifications received) Message Notification Received At diff --git a/app/src/main/res/xml/notification_detail.xml b/app/src/main/res/xml/notification_detail.xml index 8ae8cfddb..bf48c35e5 100644 --- a/app/src/main/res/xml/notification_detail.xml +++ b/app/src/main/res/xml/notification_detail.xml @@ -20,4 +20,13 @@ app:title="@string/notification_data" app:iconSpaceReserved="false" app:enableCopying="true" /> + + + \ No newline at end of file diff --git a/app/src/main/res/xml/notifications.xml b/app/src/main/res/xml/notifications.xml index 198c7e44e..2c879f24c 100644 --- a/app/src/main/res/xml/notifications.xml +++ b/app/src/main/res/xml/notifications.xml @@ -2,10 +2,28 @@ - + + + + + + \ No newline at end of file