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