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.notifications.DeviceCommandData
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.commandBleTransmitter
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.prepareText
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.getActiveNotification
import io.homeassistant.companion.android.common.util.speakText
@ -145,7 +145,6 @@ class MessagingManager @Inject constructor(
// special action constants
const val REQUEST_LOCATION_UPDATE = "request_location_update"
const val CLEAR_NOTIFICATION = "clear_notification"
const val REMOVE_CHANNEL = "remove_channel"
const val COMMAND_DND = "command_dnd"
const val COMMAND_RINGER_MODE = "command_ringer_mode"
@ -309,9 +308,8 @@ class MessagingManager @Inject constructor(
Log.d(TAG, "Request location update")
requestAccurateLocationUpdate()
}
jsonData[NotificationData.MESSAGE] == CLEAR_NOTIFICATION && !jsonData["tag"].isNullOrBlank() -> {
Log.d(TAG, "Clearing notification with tag: ${jsonData["tag"]}")
clearNotification(jsonData["tag"]!!)
jsonData[NotificationData.MESSAGE] == NotificationData.CLEAR_NOTIFICATION && !jsonData["tag"].isNullOrBlank() -> {
clearNotification(context, jsonData["tag"]!!)
}
jsonData[NotificationData.MESSAGE] == REMOVE_CHANNEL && !jsonData[NotificationData.CHANNEL].isNullOrBlank() -> {
Log.d(TAG, "Removing Notification channel ${jsonData[NotificationData.CHANNEL]}")
@ -545,15 +543,6 @@ class MessagingManager @Inject constructor(
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) {
val notificationManagerCompat = NotificationManagerCompat.from(context)
@ -886,7 +875,6 @@ class MessagingManager @Inject constructor(
/**
* 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) {
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.vdurmont.emoji.EmojiParser
import io.homeassistant.companion.android.common.R
import io.homeassistant.companion.android.common.util.cancel
import io.homeassistant.companion.android.common.util.generalChannel
import java.util.Locale
@ -51,6 +52,9 @@ object NotificationData {
const val MEDIA_STREAM = "media_stream"
val ALARM_STREAMS = listOf(ALARM_STREAM, ALARM_STREAM_MAX)
// special action constants
const val CLEAR_NOTIFICATION = "clear_notification"
}
fun createChannelID(
@ -279,3 +283,10 @@ fun handleText(
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.notifications.DeviceCommandData
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.commandBleTransmitter
import io.homeassistant.companion.android.common.notifications.getGroupNotificationBuilder
@ -64,6 +65,9 @@ class MessagingManager @Inject constructor(
val allowCommands = serverManager.integrationRepository(serverId).isTrusted()
val message = notificationData[NotificationData.MESSAGE]
when {
message == NotificationData.CLEAR_NOTIFICATION && !notificationData["tag"].isNullOrBlank() -> {
clearNotification(context, notificationData["tag"]!!)
}
message == DeviceCommandData.COMMAND_BEACON_MONITOR && allowCommands -> {
if (!commandBeaconMonitor(context, notificationData)) {
sendNotification(notificationData, now)