mirror of
https://github.com/home-assistant/android
synced 2024-09-18 23:52:51 +00:00
Allow notifications from history to be deleted one at a time or all at once (#1058)
This commit is contained in:
parent
40c8596150
commit
c620bbabd2
|
@ -4,6 +4,7 @@ import android.os.Bundle
|
||||||
import androidx.preference.Preference
|
import androidx.preference.Preference
|
||||||
import androidx.preference.PreferenceFragmentCompat
|
import androidx.preference.PreferenceFragmentCompat
|
||||||
import io.homeassistant.companion.android.R
|
import io.homeassistant.companion.android.R
|
||||||
|
import io.homeassistant.companion.android.database.AppDatabase
|
||||||
import io.homeassistant.companion.android.database.notification.NotificationItem
|
import io.homeassistant.companion.android.database.notification.NotificationItem
|
||||||
import java.util.Calendar
|
import java.util.Calendar
|
||||||
import java.util.GregorianCalendar
|
import java.util.GregorianCalendar
|
||||||
|
@ -24,6 +25,7 @@ class NotificationDetailFragment(
|
||||||
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
|
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
|
||||||
|
|
||||||
addPreferencesFromResource(R.xml.notification_detail)
|
addPreferencesFromResource(R.xml.notification_detail)
|
||||||
|
|
||||||
findPreference<Preference>("received_at")?.let {
|
findPreference<Preference>("received_at")?.let {
|
||||||
val cal: Calendar = GregorianCalendar()
|
val cal: Calendar = GregorianCalendar()
|
||||||
cal.timeInMillis = notification.received
|
cal.timeInMillis = notification.received
|
||||||
|
@ -37,5 +39,40 @@ class NotificationDetailFragment(
|
||||||
findPreference<Preference>("data")?.let {
|
findPreference<Preference>("data")?.let {
|
||||||
it.summary = notification.data
|
it.summary = notification.data
|
||||||
}
|
}
|
||||||
|
|
||||||
|
findPreference<Preference>("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()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,11 +1,13 @@
|
||||||
package io.homeassistant.companion.android.settings.notification
|
package io.homeassistant.companion.android.settings.notification
|
||||||
|
|
||||||
|
import android.app.AlertDialog
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import androidx.preference.Preference
|
import androidx.preference.Preference
|
||||||
import androidx.preference.PreferenceCategory
|
import androidx.preference.PreferenceCategory
|
||||||
import androidx.preference.PreferenceFragmentCompat
|
import androidx.preference.PreferenceFragmentCompat
|
||||||
import io.homeassistant.companion.android.R
|
import io.homeassistant.companion.android.R
|
||||||
import io.homeassistant.companion.android.database.AppDatabase
|
import io.homeassistant.companion.android.database.AppDatabase
|
||||||
|
import io.homeassistant.companion.android.database.notification.NotificationDao
|
||||||
import java.util.Calendar
|
import java.util.Calendar
|
||||||
import java.util.GregorianCalendar
|
import java.util.GregorianCalendar
|
||||||
|
|
||||||
|
@ -18,16 +20,19 @@ class NotificationHistoryFragment : PreferenceFragmentCompat() {
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
|
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
|
||||||
|
|
||||||
setPreferencesFromResource(R.xml.notifications, rootKey)
|
setPreferencesFromResource(R.xml.notifications, rootKey)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onResume() {
|
||||||
|
super.onResume()
|
||||||
|
|
||||||
val notificationDao = AppDatabase.getInstance(requireContext()).notificationDao()
|
val notificationDao = AppDatabase.getInstance(requireContext()).notificationDao()
|
||||||
val notificationList = notificationDao.getLast25()
|
val notificationList = notificationDao.getLast25()
|
||||||
|
|
||||||
val prefCategory = PreferenceCategory(preferenceScreen.context)
|
val prefCategory = findPreference<PreferenceCategory>("list_notifications")
|
||||||
if (!notificationList.isNullOrEmpty()) {
|
if (!notificationList.isNullOrEmpty()) {
|
||||||
prefCategory.title = requireContext().getString(R.string.last_25_notifications)
|
prefCategory?.isVisible = true
|
||||||
prefCategory.isIconSpaceReserved = false
|
prefCategory?.removeAll()
|
||||||
preferenceScreen.addPreference(prefCategory)
|
|
||||||
for (item in notificationList) {
|
for (item in notificationList) {
|
||||||
val pref = Preference(preferenceScreen.context)
|
val pref = Preference(preferenceScreen.context)
|
||||||
val cal: Calendar = GregorianCalendar()
|
val cal: Calendar = GregorianCalendar()
|
||||||
|
@ -51,12 +56,54 @@ class NotificationHistoryFragment : PreferenceFragmentCompat() {
|
||||||
return@setOnPreferenceClickListener true
|
return@setOnPreferenceClickListener true
|
||||||
}
|
}
|
||||||
|
|
||||||
prefCategory.addPreference(pref)
|
prefCategory?.addPreference(pref)
|
||||||
|
}
|
||||||
|
|
||||||
|
findPreference<PreferenceCategory>("manage_notifications")?.let {
|
||||||
|
it.isVisible = true
|
||||||
|
}
|
||||||
|
|
||||||
|
findPreference<Preference>("delete_all")?.let {
|
||||||
|
it.isVisible = true
|
||||||
|
it.setOnPreferenceClickListener { _ ->
|
||||||
|
deleteAllConfirmation(notificationDao)
|
||||||
|
return@setOnPreferenceClickListener true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
findPreference<PreferenceCategory>("manage_notifications")?.let {
|
||||||
|
it.isVisible = false
|
||||||
|
}
|
||||||
|
findPreference<PreferenceCategory>("list_notifications")?.let {
|
||||||
|
it.isVisible = false
|
||||||
|
}
|
||||||
findPreference<Preference>("no_notifications")?.let {
|
findPreference<Preference>("no_notifications")?.let {
|
||||||
it.isVisible = true
|
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()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
9
app/src/main/res/drawable/ic_delete.xml
Normal file
9
app/src/main/res/drawable/ic_delete.xml
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:viewportWidth="24.0"
|
||||||
|
android:viewportHeight="24.0">
|
||||||
|
<path
|
||||||
|
android:fillColor="@color/colorAccent"
|
||||||
|
android:pathData="M6,19c0,1.1 0.9,2 2,2h8c1.1,0 2,-0.9 2,-2V7H6v12zM19,4h-3.5l-1,-1h-5l-1,1H5v2h14V4z"/>
|
||||||
|
</vector>
|
9
app/src/main/res/drawable/ic_ringer_mute.xml
Normal file
9
app/src/main/res/drawable/ic_ringer_mute.xml
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="28dp"
|
||||||
|
android:height="28dp"
|
||||||
|
android:viewportWidth="48.0"
|
||||||
|
android:viewportHeight="48.0">
|
||||||
|
<path
|
||||||
|
android:fillColor="@color/colorAccent"
|
||||||
|
android:pathData="M23.000000,44.000000c2.200000,0.000000 4.000000,-1.800000 4.000000,-4.000000l-8.000000,0.000000C19.000000,42.200001 20.799999,44.000000 23.000000,44.000000zM36.000000,21.000000c0.000000,-6.100000 -4.300000,-11.300000 -10.000000,-12.600000L26.000000,7.000000c0.000000,-1.700000 -1.300000,-3.000000 -3.000000,-3.000000c-1.700000,0.000000 -3.000000,1.300000 -3.000000,3.000000l0.000000,1.400000c-1.000000,0.200000 -2.000000,0.600000 -2.900000,1.100000L36.000000,28.400000L36.000000,21.000000zM35.500000,38.000000l4.000000,4.000000l2.500000,-2.500000L8.500000,6.000000L6.000000,8.500000l5.800000,5.800000C10.700000,16.299999 10.000000,18.600000 10.000000,21.000000l0.000000,11.000000l-4.000000,4.000000l0.000000,2.000000L35.500000,38.000000z"/>
|
||||||
|
</vector>
|
|
@ -167,6 +167,16 @@ Home Assistant instance</string>
|
||||||
<string name="notification_dismiss_failure">Failed to send event on notification dismissed</string>
|
<string name="notification_dismiss_failure">Failed to send event on notification dismissed</string>
|
||||||
<string name="notification_data">Full Notification Data</string>
|
<string name="notification_data">Full Notification Data</string>
|
||||||
<string name="notification_history">Notification History</string>
|
<string name="notification_history">Notification History</string>
|
||||||
|
<string name="manage_all_notifications">Manage All Notifications</string>
|
||||||
|
<string name="manage_this_notification">Manage This Notification</string>
|
||||||
|
<string name="delete_all_notifications">Delete all notifications from history</string>
|
||||||
|
<string name="delete_this_notification">Delete this notification from history</string>
|
||||||
|
<string name="confirm_delete_this_notification_title">Confirm deleting this notification</string>
|
||||||
|
<string name="confirm_delete_this_notification_message">Are you sure? This cannot be undone</string>
|
||||||
|
<string name="confirm_delete_all_notification_title">Confirm deleting all notifications</string>
|
||||||
|
<string name="confirm_delete_all_notification_message">Are you sure? This cannot be undone</string>
|
||||||
|
<string name="confirm_positive">YES</string>
|
||||||
|
<string name="confirm_negative">NO</string>
|
||||||
<string name="notification_history_summary">History of Notifications (currently displays the last 25 notifications received)</string>
|
<string name="notification_history_summary">History of Notifications (currently displays the last 25 notifications received)</string>
|
||||||
<string name="notification_message">Message</string>
|
<string name="notification_message">Message</string>
|
||||||
<string name="notification_received_at">Notification Received At</string>
|
<string name="notification_received_at">Notification Received At</string>
|
||||||
|
|
|
@ -20,4 +20,13 @@
|
||||||
app:title="@string/notification_data"
|
app:title="@string/notification_data"
|
||||||
app:iconSpaceReserved="false"
|
app:iconSpaceReserved="false"
|
||||||
app:enableCopying="true" />
|
app:enableCopying="true" />
|
||||||
|
<PreferenceCategory
|
||||||
|
app:key="manage_this_notification"
|
||||||
|
app:iconSpaceReserved="false"
|
||||||
|
app:title="@string/manage_this_notification">
|
||||||
|
<Preference
|
||||||
|
app:key="delete_notification"
|
||||||
|
app:icon="@drawable/ic_delete"
|
||||||
|
app:title="@string/delete_this_notification"/>
|
||||||
|
</PreferenceCategory>
|
||||||
</androidx.preference.PreferenceScreen>
|
</androidx.preference.PreferenceScreen>
|
|
@ -2,10 +2,28 @@
|
||||||
<androidx.preference.PreferenceScreen
|
<androidx.preference.PreferenceScreen
|
||||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto">
|
xmlns:app="http://schemas.android.com/apk/res-auto">
|
||||||
<Preference
|
<Preference
|
||||||
android:key="no_notifications"
|
android:key="no_notifications"
|
||||||
android:title="@string/no_notifications"
|
android:title="@string/no_notifications"
|
||||||
android:summary="@string/no_notifications_summary"
|
android:summary="@string/no_notifications_summary"
|
||||||
android:selectable="false"
|
android:selectable="false"
|
||||||
app:isPreferenceVisible="false" />
|
app:icon="@drawable/ic_ringer_mute"
|
||||||
|
app:isPreferenceVisible="false" />
|
||||||
|
|
||||||
|
<PreferenceCategory
|
||||||
|
android:key="manage_notifications"
|
||||||
|
android:title="@string/manage_all_notifications"
|
||||||
|
app:isPreferenceVisible="false"
|
||||||
|
app:iconSpaceReserved="false">
|
||||||
|
<Preference
|
||||||
|
android:key="delete_all"
|
||||||
|
android:title="@string/delete_all_notifications"
|
||||||
|
app:icon="@drawable/ic_delete"
|
||||||
|
app:isPreferenceVisible="false" />
|
||||||
|
</PreferenceCategory>
|
||||||
|
<PreferenceCategory
|
||||||
|
android:key="list_notifications"
|
||||||
|
android:title="@string/last_25_notifications"
|
||||||
|
app:iconSpaceReserved="false"
|
||||||
|
app:isPreferenceVisible="false" />
|
||||||
</androidx.preference.PreferenceScreen>
|
</androidx.preference.PreferenceScreen>
|
Loading…
Reference in a new issue