1 /** 2 * Copyright (C) 2022 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5 * in compliance with the License. You may obtain a copy of the License at 6 * 7 * ``` 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * ``` 10 * 11 * Unless required by applicable law or agreed to in writing, software distributed under the License 12 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 13 * or implied. See the License for the specific language governing permissions and limitations under 14 * the License. 15 */ 16 package com.android.healthconnect.controller.dataentries.formatters 17 18 import android.content.Context 19 import android.health.connect.datatypes.units.TemperatureDelta 20 import android.icu.number.NumberFormatter 21 import android.icu.text.MessageFormat 22 import com.android.healthconnect.controller.R 23 import com.android.healthconnect.controller.dataentries.units.TemperatureUnit 24 import com.android.healthconnect.controller.dataentries.units.UnitPreferences 25 import kotlin.math.round 26 27 object TemperatureDeltaFormatter { 28 formatSingleDeltaValuenull29 fun formatSingleDeltaValue( 30 context: Context, 31 temperatureDelta: TemperatureDelta, 32 unitPreferences: UnitPreferences 33 ): String { 34 val res = 35 when (unitPreferences.getTemperatureUnit()) { 36 TemperatureUnit.CELSIUS -> R.string.temperatureDelta_celsius 37 TemperatureUnit.FAHRENHEIT -> R.string.temperatureDelta_fahrenheit 38 TemperatureUnit.KELVIN -> R.string.temperatureDelta_kelvin 39 } 40 return formatTemperatureDelta(context, res, temperatureDelta, unitPreferences) 41 } 42 formatAverageDeltaValuenull43 fun formatAverageDeltaValue( 44 context: Context, 45 temperatureDelta: TemperatureDelta, 46 unitPreferences: UnitPreferences 47 ): String { 48 val res = 49 when (unitPreferences.getTemperatureUnit()) { 50 TemperatureUnit.CELSIUS -> R.string.temperatureDelta_average_celsius 51 TemperatureUnit.FAHRENHEIT -> R.string.temperatureDelta_average_fahrenheit 52 TemperatureUnit.KELVIN -> R.string.temperatureDelta_average_kelvin 53 } 54 return formatTemperatureDelta(context, res, temperatureDelta, unitPreferences) 55 } 56 formatSingleDeltaA11yValuenull57 fun formatSingleDeltaA11yValue( 58 context: Context, 59 temperatureDelta: TemperatureDelta, 60 unitPreferences: UnitPreferences 61 ): String { 62 val res = 63 when (unitPreferences.getTemperatureUnit()) { 64 TemperatureUnit.CELSIUS -> R.string.temperatureDelta_celsius_long 65 TemperatureUnit.FAHRENHEIT -> R.string.temperatureDelta_fahrenheit_long 66 TemperatureUnit.KELVIN -> R.string.temperatureDelta_kelvin_long 67 } 68 return formatTemperatureDelta(context, res, temperatureDelta, unitPreferences) 69 } 70 formatAverageDeltaA11yValuenull71 fun formatAverageDeltaA11yValue( 72 context: Context, 73 temperatureDelta: TemperatureDelta, 74 unitPreferences: UnitPreferences 75 ): String { 76 val res = 77 when (unitPreferences.getTemperatureUnit()) { 78 TemperatureUnit.CELSIUS -> R.string.temperatureDelta_average_celsius_long 79 TemperatureUnit.FAHRENHEIT -> R.string.temperatureDelta_average_fahrenheit_long 80 TemperatureUnit.KELVIN -> R.string.temperatureDelta_average_kelvin_long 81 } 82 return formatTemperatureDelta(context, res, temperatureDelta, unitPreferences) 83 } 84 formatTemperatureDeltanull85 private fun formatTemperatureDelta( 86 context: Context, 87 res: Int, 88 temperatureDelta: TemperatureDelta, 89 unitPreferences: UnitPreferences 90 ): String { 91 // when implemented can use TemperatureDelta methods for conversion 92 val temp = 93 round( 94 convertTemperatureDelta( 95 temperatureDelta.inCelsius, unitPreferences.getTemperatureUnit()) * 10) / 10 96 val formattedTemp = 97 NumberFormatter.with() 98 .sign(NumberFormatter.SignDisplay.EXCEPT_ZERO) 99 .locale(context.resources.configuration.locale) 100 .format(temp) 101 .toString() 102 return MessageFormat.format( 103 context.getString(res), 104 mapOf("value" to (temp * temp), "formattedValue" to formattedTemp)) 105 } 106 convertTemperatureDeltanull107 private fun convertTemperatureDelta( 108 temperatureDelta: Double, 109 unitPreference: TemperatureUnit 110 ): Double { 111 return when (unitPreference) { 112 TemperatureUnit.CELSIUS -> temperatureDelta 113 TemperatureUnit.FAHRENHEIT -> temperatureDelta * 1.8 114 TemperatureUnit.KELVIN -> temperatureDelta 115 } 116 } 117 } 118