Add deeplinks to Wear OS sensor sync notifications (#3105)

Add deeplinks to Wear sensor sync notifications
This commit is contained in:
Joris Pelgröm 2022-11-29 04:11:57 +01:00 committed by GitHub
parent fd7a593c41
commit 442cb25e59
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 45 additions and 8 deletions

View file

@ -2,6 +2,7 @@ package io.homeassistant.companion.android.sensors
import android.annotation.SuppressLint
import android.app.NotificationManager
import android.app.PendingIntent
import android.bluetooth.BluetoothAdapter
import android.content.Context
import android.content.Intent
@ -99,11 +100,17 @@ class SensorReceiver : SensorReceiverBase() {
WifiManager.WIFI_STATE_CHANGED_ACTION to NetworkSensorManager.wifiState.id,
)
override fun getSensorSettingsIntent(context: Context, id: String): Intent? {
return SettingsActivity.newInstance(context).apply {
putExtra("fragment", "sensors/$id")
override fun getSensorSettingsIntent(
context: Context,
sensorId: String,
sensorManagerId: String,
notificationId: Int
): PendingIntent? {
val intent = SettingsActivity.newInstance(context).apply {
putExtra("fragment", "sensors/$sensorId")
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK)
}
return PendingIntent.getActivity(context, notificationId, intent, PendingIntent.FLAG_IMMUTABLE)
}
}

View file

@ -69,7 +69,12 @@ abstract class SensorReceiverBase : BroadcastReceiver() {
protected abstract val skippableActions: Map<String, String>
protected abstract fun getSensorSettingsIntent(context: Context, id: String): Intent?
protected abstract fun getSensorSettingsIntent(
context: Context,
sensorId: String,
sensorManagerId: String,
notificationId: Int
): PendingIntent?
override fun onReceive(context: Context, intent: Intent) {
Log.d(tag, "Received intent: ${intent.action}")
@ -244,9 +249,7 @@ abstract class SensorReceiverBase : BroadcastReceiver() {
context.getSystemService<NotificationManager>()?.let { notificationManager ->
createNotificationChannel(context)
val notificationId = "$sensorCoreSyncChannel-${basicSensor.id}".hashCode()
val notificationIntent = getSensorSettingsIntent(context, basicSensor.id)?.let {
PendingIntent.getActivity(context, notificationId, it, PendingIntent.FLAG_IMMUTABLE)
}
val notificationIntent = getSensorSettingsIntent(context, basicSensor.id, manager.id(), notificationId)
val notification = NotificationCompat.Builder(context, sensorCoreSyncChannel)
.setSmallIcon(R.drawable.ic_stat_ic_notification)
.setContentTitle(context.getString(basicSensor.name))

View file

@ -8,6 +8,7 @@ import androidx.compose.runtime.setValue
import androidx.compose.ui.platform.LocalContext
import androidx.navigation.NavType
import androidx.navigation.navArgument
import androidx.navigation.navDeepLink
import androidx.wear.compose.navigation.SwipeDismissableNavHost
import androidx.wear.compose.navigation.composable
import androidx.wear.compose.navigation.rememberSwipeDismissableNavController
@ -33,6 +34,8 @@ private const val SCREEN_SELECT_TILE_SHORTCUT = "select_tile_shortcut"
private const val SCREEN_SET_TILE_TEMPLATE = "set_tile_template"
private const val SCREEN_SET_TILE_TEMPLATE_REFRESH_INTERVAL = "set_tile_template_refresh_interval"
const val DEEPLINK_SENSOR_MANAGER = "ha_wear://$SCREEN_SINGLE_SENSOR_MANAGER"
@Composable
fun LoadHomePage(
mainViewModel: MainViewModel
@ -215,6 +218,9 @@ fun LoadHomePage(
navArgument(name = ARG_SCREEN_SENSOR_MANAGER_ID) {
type = NavType.StringType
}
),
deepLinks = listOf(
navDeepLink { uriPattern = "$DEEPLINK_SENSOR_MANAGER/{$ARG_SCREEN_SENSOR_MANAGER_ID}" }
)
) { backStackEntry ->
val sensorManagerId =

View file

@ -2,12 +2,15 @@ package io.homeassistant.companion.android.sensors
import android.annotation.SuppressLint
import android.app.NotificationManager
import android.app.PendingIntent
import android.content.Context
import android.content.Intent
import android.media.AudioManager
import android.net.wifi.WifiManager
import android.os.Build
import android.os.PowerManager
import androidx.core.app.TaskStackBuilder
import androidx.core.net.toUri
import dagger.hilt.android.AndroidEntryPoint
import io.homeassistant.companion.android.BuildConfig
import io.homeassistant.companion.android.common.sensors.AudioSensorManager
@ -20,6 +23,8 @@ import io.homeassistant.companion.android.common.sensors.PowerSensorManager
import io.homeassistant.companion.android.common.sensors.SensorManager
import io.homeassistant.companion.android.common.sensors.SensorReceiverBase
import io.homeassistant.companion.android.common.sensors.StepsSensorManager
import io.homeassistant.companion.android.home.HomeActivity
import io.homeassistant.companion.android.home.views.DEEPLINK_SENSOR_MANAGER
@AndroidEntryPoint
class SensorReceiver : SensorReceiverBase() {
@ -83,5 +88,21 @@ class SensorReceiver : SensorReceiverBase() {
"com.google.android.clockwork.actions.WET_MODE_ENDED" to WetModeSensorManager.wetModeSensor.id
)
override fun getSensorSettingsIntent(context: Context, id: String): Intent? = null
override fun getSensorSettingsIntent(
context: Context,
sensorId: String,
sensorManagerId: String,
notificationId: Int
): PendingIntent? {
val intent = Intent(
Intent.ACTION_VIEW,
"$DEEPLINK_SENSOR_MANAGER/$sensorManagerId".toUri(),
context,
HomeActivity::class.java
)
return TaskStackBuilder.create(context).run {
addNextIntentWithParentStack(intent)
getPendingIntent(notificationId, PendingIntent.FLAG_UPDATE_CURRENT)
}
}
}