Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
3 changes: 3 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
Expand Up @@ -16,4 +16,7 @@ ij_kotlin_allow_trailing_comma_on_call_site = true
ij_kotlin_allow_trailing_comma = true
# Disable converting functions to expression bodies
ktlint_standard_function-expression-body = disabled
max_line_length = 120

[**/test/**.kt]
max_line_length = off
70 changes: 34 additions & 36 deletions app/gradle.lockfile

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,8 @@ import kotlinx.coroutines.launch
import timber.log.Timber

@ActivityScoped
class LaunchPresenterImpl @Inject constructor(
@ActivityContext context: Context,
serverManager: ServerManager,
) : LaunchPresenterBase(context as LaunchView, serverManager) {
class LaunchPresenterImpl @Inject constructor(@ActivityContext context: Context, serverManager: ServerManager) :
LaunchPresenterBase(context as LaunchView, serverManager) {
override fun resyncRegistration() {
if (!serverManager.isRegistered()) return
serverManager.defaultServers.forEach {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,12 @@ class HighAccuracyLocationService : Service() {

private fun createNotificationBuilder(context: Context) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val channel = NotificationChannel(CHANNEL_HIGH_ACCURACY, context.getString(commonR.string.high_accuracy_mode_channel_name), NotificationManager.IMPORTANCE_DEFAULT)
val channel =
NotificationChannel(
CHANNEL_HIGH_ACCURACY,
context.getString(commonR.string.high_accuracy_mode_channel_name),
NotificationManager.IMPORTANCE_DEFAULT,
)
notificationManagerCompat.createNotificationChannel(channel)
}

Expand Down Expand Up @@ -161,7 +166,8 @@ class HighAccuracyLocationService : Service() {
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
super.onStartCommand(intent, flags, startId)

val intervalInSeconds = intent?.getIntExtra("intervalInSeconds", DEFAULT_UPDATE_INTERVAL_SECONDS) ?: DEFAULT_UPDATE_INTERVAL_SECONDS
val intervalInSeconds =
intent?.getIntExtra("intervalInSeconds", DEFAULT_UPDATE_INTERVAL_SECONDS) ?: DEFAULT_UPDATE_INTERVAL_SECONDS
requestLocationUpdates(intervalInSeconds)

Timber.d("High accuracy location service (Interval: ${intervalInSeconds}s) started -> onStartCommand")
Expand All @@ -188,7 +194,12 @@ class HighAccuracyLocationService : Service() {
private fun getLocationUpdateIntent(): PendingIntent {
val intent = Intent(this, LocationSensorManager::class.java)
intent.action = LocationSensorManager.ACTION_PROCESS_HIGH_ACCURACY_LOCATION
return PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_MUTABLE)
return PendingIntent.getBroadcast(
this,
0,
intent,
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_MUTABLE,
)
}

@SuppressLint("MissingPermission")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,10 @@ class MatterCommissioningActivity : AppCompatActivity() {
private var servers by mutableStateOf<List<Server>>(emptyList())
private var newMatterDevice = false

private val threadPermissionLauncher = registerForActivityResult(ActivityResultContracts.StartIntentSenderForResult()) { result ->
deviceCode?.let { viewModel.onThreadPermissionResult(result, it) }
}
private val threadPermissionLauncher =
registerForActivityResult(ActivityResultContracts.StartIntentSenderForResult()) { result ->
deviceCode?.let { viewModel.onThreadPermissionResult(result, it) }
}

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,9 @@ import kotlinx.coroutines.launch
import timber.log.Timber

@AndroidEntryPoint
class MatterCommissioningService : Service(), CommissioningService.Callback {
class MatterCommissioningService :
Service(),
CommissioningService.Callback {

@Inject
lateinit var serverManager: ServerManager
Expand Down Expand Up @@ -54,8 +56,14 @@ class MatterCommissioningService : Service(), CommissioningService.Callback {
commissioningServiceDelegate.sendCommissioningError(CommissioningError.OTHER)
return@launch
}
val result = matterManager.commissionOnNetworkDevice(metadata.passcode, metadata.networkLocation.formattedIpAddress, serverId)
Timber.d("Server commissioning was ${if (result?.success == true) "successful" else "not successful (${result?.errorCode})"}")
val result = matterManager.commissionOnNetworkDevice(
metadata.passcode,
metadata.networkLocation.formattedIpAddress,
serverId,
)
Timber.d(
"Server commissioning was ${if (result?.success == true) "successful" else "not successful (${result?.errorCode})"}",
)

if (result?.success == true) {
commissioningServiceDelegate.sendCommissioningComplete(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@ class MatterManagerImpl @Inject constructor(
private val packageManager: PackageManager,
) : MatterManager {

override fun appSupportsCommissioning(): Boolean =
Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1 && !packageManager.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE)
override fun appSupportsCommissioning(): Boolean = Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1 &&
!packageManager.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE)

override suspend fun coreSupportsCommissioning(serverId: Int): Boolean {
if (!serverManager.isRegistered() || serverManager.getServer(serverId)?.user?.isAdmin != true) return false
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -106,17 +106,28 @@ fun MatterCommissioningView(
} else {
Text(
text = when (step) {
CommissioningFlowStep.NotRegistered -> stringResource(commonR.string.matter_shared_status_not_registered)
CommissioningFlowStep.SelectServer -> stringResource(commonR.string.matter_shared_status_select_server)
CommissioningFlowStep.NotSupported -> stringResource(commonR.string.matter_shared_status_not_supported)
CommissioningFlowStep.NotRegistered -> stringResource(
commonR.string.matter_shared_status_not_registered,
)
CommissioningFlowStep.SelectServer -> stringResource(
commonR.string.matter_shared_status_select_server,
)
CommissioningFlowStep.NotSupported -> stringResource(
commonR.string.matter_shared_status_not_supported,
)
CommissioningFlowStep.Confirmation -> {
if (deviceName?.isNotBlank() == true) {
stringResource(commonR.string.matter_shared_status_confirmation_named, deviceName)
stringResource(
commonR.string.matter_shared_status_confirmation_named,
deviceName,
)
} else {
stringResource(commonR.string.matter_shared_status_confirmation)
}
}
CommissioningFlowStep.Success -> stringResource(commonR.string.matter_shared_status_success)
CommissioningFlowStep.Success -> stringResource(
commonR.string.matter_shared_status_success,
)
is CommissioningFlowStep.Failure -> {
if (step.errorCode != null) {
stringResource(commonR.string.matter_shared_status_failure_code, step.errorCode)
Expand Down Expand Up @@ -228,7 +239,14 @@ fun PreviewMatterCommissioningView(
step = step,
deviceName = "Manufacturer Matter Light",
servers = listOf(
Server(id = 0, _name = "Home", listOrder = -1, connection = ServerConnectionInfo(externalUrl = ""), session = ServerSessionInfo(), user = ServerUserInfo()),
Server(
id = 0,
_name = "Home",
listOrder = -1,
connection = ServerConnectionInfo(externalUrl = ""),
session = ServerSessionInfo(),
user = ServerUserInfo(),
),
),
onSelectServer = { },
onConfirmCommissioning = { },
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,9 @@ import kotlinx.coroutines.launch
import timber.log.Timber

@AndroidEntryPoint
class ActivitySensorManager : BroadcastReceiver(), SensorManager {
class ActivitySensorManager :
BroadcastReceiver(),
SensorManager {

companion object {
const val ACTION_UPDATE_ACTIVITY =
Expand Down Expand Up @@ -112,7 +114,8 @@ class ActivitySensorManager : BroadcastReceiver(), SensorManager {
probActivity,
getSensorIcon(probActivity),
result.probableActivities.associate { typeToString(it) to it.confidence }.plus(
"options" to listOf("in_vehicle", "on_bicycle", "on_foot", "still", "tilting", "walking", "running"),
"options" to
listOf("in_vehicle", "on_bicycle", "on_foot", "still", "tilting", "walking", "running"),
),
)
}
Expand Down Expand Up @@ -236,11 +239,13 @@ class ActivitySensorManager : BroadcastReceiver(), SensorManager {
}
}
if ((
isEnabled(context, sleepConfidence) || isEnabled(
context,
sleepSegment,
)
) && !sleepRegistration
isEnabled(context, sleepConfidence) ||
isEnabled(
context,
sleepSegment,
)
) &&
!sleepRegistration
) {
val pendingIntent = getSleepPendingIntent(context)
Timber.d("Registering for sleep updates")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,9 @@ import io.homeassistant.companion.android.common.sensors.SensorManager
import kotlinx.coroutines.launch
import timber.log.Timber

class AndroidAutoSensorManager : SensorManager, Observer<Int> {
class AndroidAutoSensorManager :
SensorManager,
Observer<Int> {

companion object {
private val androidAutoConnected = SensorManager.BasicSensor(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -560,12 +560,17 @@ class HealthConnectSensorManager : SensorManager {
onSensorUpdated(
context,
if (isDiastolic) diastolicBloodPressure else systolicBloodPressure,
if (isDiastolic) response.records.last().diastolic.inMillimetersOfMercury else response.records.last().systolic.inMillimetersOfMercury,
if (isDiastolic) {
response.records.last().diastolic.inMillimetersOfMercury
} else {
response.records.last().systolic.inMillimetersOfMercury
},
if (isDiastolic) diastolicBloodPressure.statelessIcon else systolicBloodPressure.statelessIcon,
attributes = mapOf(
"bodyPosition" to getBloodPressureBodyPosition(response.records.last().bodyPosition),
"date" to response.records.last().time,
"measurementLocation" to getBloodPressureMeasurementLocation(response.records.last().measurementLocation),
"measurementLocation" to
getBloodPressureMeasurementLocation(response.records.last().measurementLocation),
"source" to response.records.last().metadata.dataOrigin.packageName,
),
)
Expand Down Expand Up @@ -623,7 +628,8 @@ class HealthConnectSensorManager : SensorManager {
bodyTemperature.statelessIcon,
attributes = mapOf(
"date" to response.records.last().time,
"measurementLocation" to getBodyTemperatureMeasurementLocation(response.records.last().measurementLocation),
"measurementLocation" to
getBodyTemperatureMeasurementLocation(response.records.last().measurementLocation),
"source" to response.records.last().metadata.dataOrigin.packageName,
),
)
Expand All @@ -650,7 +656,8 @@ class HealthConnectSensorManager : SensorManager {

private suspend fun updateDistanceSensor(context: Context) {
val healthConnectClient = getOrCreateHealthConnectClient(context) ?: return
val distanceRequest = healthConnectClient.aggregateOrNull(buildAggregationRequest(DistanceRecord.DISTANCE_TOTAL)) ?: return
val distanceRequest =
healthConnectClient.aggregateOrNull(buildAggregationRequest(DistanceRecord.DISTANCE_TOTAL)) ?: return
val distanceTotal = distanceRequest[DistanceRecord.DISTANCE_TOTAL]?.inMeters ?: 0
onSensorUpdated(
context,
Expand All @@ -663,7 +670,9 @@ class HealthConnectSensorManager : SensorManager {

private suspend fun updateElevationGainedSensor(context: Context) {
val healthConnectClient = getOrCreateHealthConnectClient(context) ?: return
val elevationGainedRequest = healthConnectClient.aggregateOrNull(buildAggregationRequest(ElevationGainedRecord.ELEVATION_GAINED_TOTAL)) ?: return
val elevationGainedRequest =
healthConnectClient.aggregateOrNull(buildAggregationRequest(ElevationGainedRecord.ELEVATION_GAINED_TOTAL))
?: return
val elevationValue = elevationGainedRequest[ElevationGainedRecord.ELEVATION_GAINED_TOTAL]?.inMeters ?: 0
onSensorUpdated(
context,
Expand All @@ -676,7 +685,9 @@ class HealthConnectSensorManager : SensorManager {

private suspend fun updateFloorsClimbedSensor(context: Context) {
val healthConnectClient = getOrCreateHealthConnectClient(context) ?: return
val floorsClimbedRequest = healthConnectClient.aggregateOrNull(buildAggregationRequest(FloorsClimbedRecord.FLOORS_CLIMBED_TOTAL)) ?: return
val floorsClimbedRequest =
healthConnectClient.aggregateOrNull(buildAggregationRequest(FloorsClimbedRecord.FLOORS_CLIMBED_TOTAL))
?: return
val floors = floorsClimbedRequest[FloorsClimbedRecord.FLOORS_CLIMBED_TOTAL] ?: 0
onSensorUpdated(
context,
Expand Down Expand Up @@ -746,7 +757,8 @@ class HealthConnectSensorManager : SensorManager {

private suspend fun updateHydrationSensor(context: Context) {
val healthConnectClient = getOrCreateHealthConnectClient(context) ?: return
val hydrationRequest = healthConnectClient.aggregateOrNull(buildAggregationRequest(HydrationRecord.VOLUME_TOTAL)) ?: return
val hydrationRequest =
healthConnectClient.aggregateOrNull(buildAggregationRequest(HydrationRecord.VOLUME_TOTAL)) ?: return
val hydrationTotal = hydrationRequest[HydrationRecord.VOLUME_TOTAL]?.inMilliliters ?: 0
onSensorUpdated(
context,
Expand Down Expand Up @@ -858,7 +870,8 @@ class HealthConnectSensorManager : SensorManager {

private suspend fun updateStepsSensor(context: Context) {
val healthConnectClient = getOrCreateHealthConnectClient(context) ?: return
val stepsRequest = healthConnectClient.aggregateOrNull(buildAggregationRequest(StepsRecord.COUNT_TOTAL)) ?: return
val stepsRequest =
healthConnectClient.aggregateOrNull(buildAggregationRequest(StepsRecord.COUNT_TOTAL)) ?: return
val totalSteps = stepsRequest[StepsRecord.COUNT_TOTAL] ?: 0
onSensorUpdated(
context,
Expand All @@ -871,7 +884,9 @@ class HealthConnectSensorManager : SensorManager {

private suspend fun updateTotalCaloriesBurnedSensor(context: Context) {
val healthConnectClient = getOrCreateHealthConnectClient(context) ?: return
val totalCaloriesBurnedRequest = healthConnectClient.aggregateOrNull(buildAggregationRequest(TotalCaloriesBurnedRecord.ENERGY_TOTAL)) ?: return
val totalCaloriesBurnedRequest =
healthConnectClient.aggregateOrNull(buildAggregationRequest(TotalCaloriesBurnedRecord.ENERGY_TOTAL))
?: return
val energy = totalCaloriesBurnedRequest[TotalCaloriesBurnedRecord.ENERGY_TOTAL]?.inKilocalories ?: 0.0
onSensorUpdated(
context,
Expand Down Expand Up @@ -967,7 +982,9 @@ class HealthConnectSensorManager : SensorManager {
override suspend fun checkPermission(context: Context, sensorId: String): Boolean {
val healthConnectClient = getOrCreateHealthConnectClient(context) ?: return false
return try {
healthConnectClient.permissionController.getGrantedPermissions().containsAll(requiredPermissions(sensorId).toSet())
healthConnectClient.permissionController.getGrantedPermissions().containsAll(
requiredPermissions(sensorId).toSet(),
)
} catch (e: Exception) {
Timber.e(e, "Unable to check permissions")
true // default to true as we still need to check sensor enabled state
Expand All @@ -983,7 +1000,9 @@ class HealthConnectSensorManager : SensorManager {
}
}

private suspend fun <T : Record> HealthConnectClient.readRecordsOrNull(request: ReadRecordsRequest<T>): ReadRecordsResponse<T>? = try {
private suspend fun <T : Record> HealthConnectClient.readRecordsOrNull(
request: ReadRecordsRequest<T>,
): ReadRecordsResponse<T>? = try {
readRecords(request)
} catch (e: Exception) {
Timber.e(e, "Could not read records")
Expand Down
Loading