Add clear_notification support to Wear OS (#3956)

- Move the clear_notification command to common extensions and add support in the Wear OS app
This commit is contained in:
Joris Pelgröm 2023-10-20 23:45:48 +02:00 committed by GitHub
parent a94c90e5aa
commit cda25479d6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 18 additions and 15 deletions

View File

@ -49,6 +49,7 @@ import io.homeassistant.companion.android.common.data.prefs.PrefsRepository
import io.homeassistant.companion.android.common.data.servers.ServerManager import io.homeassistant.companion.android.common.data.servers.ServerManager
import io.homeassistant.companion.android.common.notifications.DeviceCommandData import io.homeassistant.companion.android.common.notifications.DeviceCommandData
import io.homeassistant.companion.android.common.notifications.NotificationData import io.homeassistant.companion.android.common.notifications.NotificationData
import io.homeassistant.companion.android.common.notifications.clearNotification
import io.homeassistant.companion.android.common.notifications.commandBeaconMonitor import io.homeassistant.companion.android.common.notifications.commandBeaconMonitor
import io.homeassistant.companion.android.common.notifications.commandBleTransmitter import io.homeassistant.companion.android.common.notifications.commandBleTransmitter
import io.homeassistant.companion.android.common.notifications.createChannelID import io.homeassistant.companion.android.common.notifications.createChannelID
@ -61,7 +62,6 @@ import io.homeassistant.companion.android.common.notifications.parseColor
import io.homeassistant.companion.android.common.notifications.parseVibrationPattern import io.homeassistant.companion.android.common.notifications.parseVibrationPattern
import io.homeassistant.companion.android.common.notifications.prepareText import io.homeassistant.companion.android.common.notifications.prepareText
import io.homeassistant.companion.android.common.util.TextToSpeechData import io.homeassistant.companion.android.common.util.TextToSpeechData
import io.homeassistant.companion.android.common.util.cancel
import io.homeassistant.companion.android.common.util.cancelGroupIfNeeded import io.homeassistant.companion.android.common.util.cancelGroupIfNeeded
import io.homeassistant.companion.android.common.util.getActiveNotification import io.homeassistant.companion.android.common.util.getActiveNotification
import io.homeassistant.companion.android.common.util.speakText import io.homeassistant.companion.android.common.util.speakText
@ -145,7 +145,6 @@ class MessagingManager @Inject constructor(
// special action constants // special action constants
const val REQUEST_LOCATION_UPDATE = "request_location_update" const val REQUEST_LOCATION_UPDATE = "request_location_update"
const val CLEAR_NOTIFICATION = "clear_notification"
const val REMOVE_CHANNEL = "remove_channel" const val REMOVE_CHANNEL = "remove_channel"
const val COMMAND_DND = "command_dnd" const val COMMAND_DND = "command_dnd"
const val COMMAND_RINGER_MODE = "command_ringer_mode" const val COMMAND_RINGER_MODE = "command_ringer_mode"
@ -309,9 +308,8 @@ class MessagingManager @Inject constructor(
Log.d(TAG, "Request location update") Log.d(TAG, "Request location update")
requestAccurateLocationUpdate() requestAccurateLocationUpdate()
} }
jsonData[NotificationData.MESSAGE] == CLEAR_NOTIFICATION && !jsonData["tag"].isNullOrBlank() -> { jsonData[NotificationData.MESSAGE] == NotificationData.CLEAR_NOTIFICATION && !jsonData["tag"].isNullOrBlank() -> {
Log.d(TAG, "Clearing notification with tag: ${jsonData["tag"]}") clearNotification(context, jsonData["tag"]!!)
clearNotification(jsonData["tag"]!!)
} }
jsonData[NotificationData.MESSAGE] == REMOVE_CHANNEL && !jsonData[NotificationData.CHANNEL].isNullOrBlank() -> { jsonData[NotificationData.MESSAGE] == REMOVE_CHANNEL && !jsonData[NotificationData.CHANNEL].isNullOrBlank() -> {
Log.d(TAG, "Removing Notification channel ${jsonData[NotificationData.CHANNEL]}") Log.d(TAG, "Removing Notification channel ${jsonData[NotificationData.CHANNEL]}")
@ -545,15 +543,6 @@ class MessagingManager @Inject constructor(
context.sendBroadcast(intent) context.sendBroadcast(intent)
} }
private fun clearNotification(tag: String) {
val notificationManagerCompat = NotificationManagerCompat.from(context)
val messageId = tag.hashCode()
// Clear notification
notificationManagerCompat.cancel(tag, messageId, true)
}
private fun removeNotificationChannel(channelName: String) { private fun removeNotificationChannel(channelName: String) {
val notificationManagerCompat = NotificationManagerCompat.from(context) val notificationManagerCompat = NotificationManagerCompat.from(context)
@ -886,7 +875,6 @@ class MessagingManager @Inject constructor(
/** /**
* Create and show a simple notification containing the received FCM message. * Create and show a simple notification containing the received FCM message.
*
*/ */
private suspend fun sendNotification(data: Map<String, String>, id: Long? = null, received: Long? = null) { private suspend fun sendNotification(data: Map<String, String>, id: Long? = null, received: Long? = null) {
val notificationManagerCompat = NotificationManagerCompat.from(context) val notificationManagerCompat = NotificationManagerCompat.from(context)

View File

@ -22,6 +22,7 @@ import com.mikepenz.iconics.utils.colorFilter
import com.mikepenz.iconics.utils.toAndroidIconCompat import com.mikepenz.iconics.utils.toAndroidIconCompat
import com.vdurmont.emoji.EmojiParser import com.vdurmont.emoji.EmojiParser
import io.homeassistant.companion.android.common.R import io.homeassistant.companion.android.common.R
import io.homeassistant.companion.android.common.util.cancel
import io.homeassistant.companion.android.common.util.generalChannel import io.homeassistant.companion.android.common.util.generalChannel
import java.util.Locale import java.util.Locale
@ -51,6 +52,9 @@ object NotificationData {
const val MEDIA_STREAM = "media_stream" const val MEDIA_STREAM = "media_stream"
val ALARM_STREAMS = listOf(ALARM_STREAM, ALARM_STREAM_MAX) val ALARM_STREAMS = listOf(ALARM_STREAM, ALARM_STREAM_MAX)
// special action constants
const val CLEAR_NOTIFICATION = "clear_notification"
} }
fun createChannelID( fun createChannelID(
@ -279,3 +283,10 @@ fun handleText(
builder.setStyle(NotificationCompat.BigTextStyle().bigText(text)) builder.setStyle(NotificationCompat.BigTextStyle().bigText(text))
} }
} }
fun clearNotification(context: Context, tag: String) {
Log.d(NotificationData.TAG, "Clearing notification with tag: $tag")
val notificationManagerCompat = NotificationManagerCompat.from(context)
val messageId = tag.hashCode()
notificationManagerCompat.cancel(tag, messageId, true)
}

View File

@ -9,6 +9,7 @@ import dagger.hilt.android.qualifiers.ApplicationContext
import io.homeassistant.companion.android.common.data.servers.ServerManager import io.homeassistant.companion.android.common.data.servers.ServerManager
import io.homeassistant.companion.android.common.notifications.DeviceCommandData import io.homeassistant.companion.android.common.notifications.DeviceCommandData
import io.homeassistant.companion.android.common.notifications.NotificationData import io.homeassistant.companion.android.common.notifications.NotificationData
import io.homeassistant.companion.android.common.notifications.clearNotification
import io.homeassistant.companion.android.common.notifications.commandBeaconMonitor import io.homeassistant.companion.android.common.notifications.commandBeaconMonitor
import io.homeassistant.companion.android.common.notifications.commandBleTransmitter import io.homeassistant.companion.android.common.notifications.commandBleTransmitter
import io.homeassistant.companion.android.common.notifications.getGroupNotificationBuilder import io.homeassistant.companion.android.common.notifications.getGroupNotificationBuilder
@ -64,6 +65,9 @@ class MessagingManager @Inject constructor(
val allowCommands = serverManager.integrationRepository(serverId).isTrusted() val allowCommands = serverManager.integrationRepository(serverId).isTrusted()
val message = notificationData[NotificationData.MESSAGE] val message = notificationData[NotificationData.MESSAGE]
when { when {
message == NotificationData.CLEAR_NOTIFICATION && !notificationData["tag"].isNullOrBlank() -> {
clearNotification(context, notificationData["tag"]!!)
}
message == DeviceCommandData.COMMAND_BEACON_MONITOR && allowCommands -> { message == DeviceCommandData.COMMAND_BEACON_MONITOR && allowCommands -> {
if (!commandBeaconMonitor(context, notificationData)) { if (!commandBeaconMonitor(context, notificationData)) {
sendNotification(notificationData, now) sendNotification(notificationData, now)