diff options
| author | 2023-01-13 17:56:14 -0800 | |
|---|---|---|
| committer | 2023-01-31 12:25:49 -0800 | |
| commit | 1bd2b79b69ab709fb867f15b89f1def482bf15f7 (patch) | |
| tree | 79479fd28d2d9e6fef0635f207eb0d74e52a2541 | |
| parent | 5f3bb108772a76777c97ecac22e8888f8dfaff36 (diff) | |
Read weather data from smartspace
Enable the flag to write mock data using:
adb shell device_config put device_personalization_services \
EchoSmartspace__enable_mock_weather_data true
Then, set the icon enum (represented as an int) using:
adb shell device_config put device_personalization_services \
EchoSmartspace__mock_weather_state_icon_id 2
Set the temperature (int) using:
adb shell device_config put device_personalization_services \
EchoSmartspace__mock_temperature_value 22
Set the temperature unit (boolean) for isCelsius using:
adb shell device_config put device_personalization_services \
EchoSmartspace__mock_temperature_unit false
Test: Use device_config commands to test mock data
Bug: 265069396
Change-Id: Ibb110c324f3eb21c0c4fba70b2da5f0c042e9cff
| -rw-r--r-- | packages/SystemUI/plugin/src/com/android/systemui/plugins/Weather.kt | 85 | ||||
| -rw-r--r-- | packages/SystemUI/src/com/android/systemui/statusbar/lockscreen/LockscreenSmartspaceController.kt | 13 |
2 files changed, 98 insertions, 0 deletions
diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/Weather.kt b/packages/SystemUI/plugin/src/com/android/systemui/plugins/Weather.kt new file mode 100644 index 000000000000..85ec42ddbbfa --- /dev/null +++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/Weather.kt @@ -0,0 +1,85 @@ +package com.android.systemui.statusbar + +import android.os.Bundle + +class Weather(val conditions: WeatherStateIcon, val temperature: Int, val isCelsius: Boolean) { + companion object { + private const val TAG = "Weather" + private const val WEATHER_STATE_ICON_KEY = "weather_state_icon_extra_key" + private const val TEMPERATURE_VALUE_KEY = "temperature_value_extra_key" + private const val TEMPERATURE_UNIT_KEY = "temperature_unit_extra_key" + private const val INVALID_TEMPERATURE = Int.MIN_VALUE + + fun fromBundle(extras: Bundle): Weather? { + val icon = + WeatherStateIcon.fromInt( + extras.getInt(WEATHER_STATE_ICON_KEY, WeatherStateIcon.UNKNOWN_ICON.id) + ) + if (icon == null || icon == WeatherStateIcon.UNKNOWN_ICON) { + return null + } + val temperature = extras.getInt(TEMPERATURE_VALUE_KEY, INVALID_TEMPERATURE) + if (temperature == INVALID_TEMPERATURE) { + return null + } + return Weather(icon, temperature, extras.getBoolean(TEMPERATURE_UNIT_KEY)) + } + } + + enum class WeatherStateIcon(val id: Int) { + UNKNOWN_ICON(0), + + // Clear, day & night. + SUNNY(1), + CLEAR_NIGHT(2), + + // Mostly clear, day & night. + MOSTLY_SUNNY(3), + MOSTLY_CLEAR_NIGHT(4), + + // Partly cloudy, day & night. + PARTLY_CLOUDY(5), + PARTLY_CLOUDY_NIGHT(6), + + // Mostly cloudy, day & night. + MOSTLY_CLOUDY_DAY(7), + MOSTLY_CLOUDY_NIGHT(8), + CLOUDY(9), + HAZE_FOG_DUST_SMOKE(10), + DRIZZLE(11), + HEAVY_RAIN(12), + SHOWERS_RAIN(13), + + // Scattered showers, day & night. + SCATTERED_SHOWERS_DAY(14), + SCATTERED_SHOWERS_NIGHT(15), + + // Isolated scattered thunderstorms, day & night. + ISOLATED_SCATTERED_TSTORMS_DAY(16), + ISOLATED_SCATTERED_TSTORMS_NIGHT(17), + STRONG_TSTORMS(18), + BLIZZARD(19), + BLOWING_SNOW(20), + FLURRIES(21), + HEAVY_SNOW(22), + + // Scattered snow showers, day & night. + SCATTERED_SNOW_SHOWERS_DAY(23), + SCATTERED_SNOW_SHOWERS_NIGHT(24), + SNOW_SHOWERS_SNOW(25), + MIXED_RAIN_HAIL_RAIN_SLEET(26), + SLEET_HAIL(27), + TORNADO(28), + TROPICAL_STORM_HURRICANE(29), + WINDY_BREEZY(30), + WINTRY_MIX_RAIN_SNOW(31); + + companion object { + fun fromInt(value: Int) = values().firstOrNull { it.id == value } + } + } + + override fun toString(): String { + return "$conditions $temperature${if (isCelsius) "C" else "F"}" + } +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/lockscreen/LockscreenSmartspaceController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/lockscreen/LockscreenSmartspaceController.kt index f4ca9ccee218..6364f4f0e0dc 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/lockscreen/LockscreenSmartspaceController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/lockscreen/LockscreenSmartspaceController.kt @@ -53,11 +53,13 @@ import com.android.systemui.settings.UserTracker import com.android.systemui.shared.regionsampling.RegionSampler import com.android.systemui.shared.regionsampling.UpdateColorCallback import com.android.systemui.smartspace.dagger.SmartspaceModule.Companion.WEATHER_SMARTSPACE_DATA_PLUGIN +import com.android.systemui.statusbar.Weather import com.android.systemui.statusbar.phone.KeyguardBypassController import com.android.systemui.statusbar.policy.ConfigurationController import com.android.systemui.statusbar.policy.DeviceProvisionedController import com.android.systemui.util.concurrency.Execution import com.android.systemui.util.settings.SecureSettings +import java.time.Instant import java.util.Optional import java.util.concurrent.Executor import javax.inject.Inject @@ -160,8 +162,19 @@ constructor( } isContentUpdatedOnce = true } + + val now = Instant.now() + val weatherTarget = targets.find { t -> + t.featureType == SmartspaceTarget.FEATURE_WEATHER && + now.isAfter(Instant.ofEpochMilli(t.creationTimeMillis)) && + now.isBefore(Instant.ofEpochMilli(t.expiryTimeMillis)) + } + if (weatherTarget != null) { + val weatherData = Weather.fromBundle(weatherTarget.baseAction.extras) + } } + private val userTrackerCallback = object : UserTracker.Callback { override fun onUserChanged(newUser: Int, userContext: Context) { execution.assertIsMainThread() |