blob: 124df32af5e0c59e3f0fde5632dd302189ed980c [file] [log] [blame]
/*
* Copyright (C) 2020 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.systemui.controls.ui
import android.annotation.ColorRes
import android.annotation.MainThread
import android.content.ComponentName
import android.content.Context
import android.graphics.drawable.Drawable
import android.service.controls.DeviceTypes
import android.service.controls.templates.TemperatureControlTemplate
import android.util.ArrayMap
import android.util.SparseArray
import com.android.systemui.R
data class IconState(val disabledResourceId: Int, val enabledResourceId: Int) {
operator fun get(state: Boolean): Int {
return if (state) {
enabledResourceId
} else {
disabledResourceId
}
}
}
data class RenderInfo(
val icon: Drawable,
val foreground: Int,
@ColorRes val enabledBackground: Int
) {
companion object {
const val APP_ICON_ID = -1
private val iconMap = SparseArray<Drawable>()
private val appIconMap = ArrayMap<ComponentName, Drawable>()
@MainThread
fun lookup(
context: Context,
componentName: ComponentName,
deviceType: Int,
enabled: Boolean,
offset: Int = 0
): RenderInfo {
val key = if (offset > 0) {
deviceType * BUCKET_SIZE + offset
} else deviceType
val (fg, bg) = deviceColorMap.getValue(key)
val iconState = deviceIconMap.getValue(key)
val resourceId = iconState[enabled]
var icon: Drawable?
if (resourceId == APP_ICON_ID) {
icon = appIconMap.get(componentName)
if (icon == null) {
icon = context.resources
.getDrawable(R.drawable.ic_device_unknown_on, null)
appIconMap.put(componentName, icon)
}
} else {
icon = iconMap.get(resourceId)
if (icon == null) {
icon = context.resources.getDrawable(resourceId, null)
icon.mutate()
iconMap.put(resourceId, icon)
}
}
return RenderInfo(icon!!, fg, bg)
}
fun registerComponentIcon(componentName: ComponentName, icon: Drawable) {
appIconMap.put(componentName, icon)
}
fun clearCache() {
iconMap.clear()
appIconMap.clear()
}
}
}
private const val BUCKET_SIZE = 1000
private const val THERMOSTAT_RANGE = DeviceTypes.TYPE_THERMOSTAT * BUCKET_SIZE
private val deviceColorMap = mapOf<Int, Pair<Int, Int>>(
(THERMOSTAT_RANGE + TemperatureControlTemplate.MODE_HEAT) to
Pair(R.color.thermo_heat_foreground, R.color.control_enabled_thermo_heat_background),
(THERMOSTAT_RANGE + TemperatureControlTemplate.MODE_COOL) to
Pair(R.color.thermo_cool_foreground, R.color.control_enabled_thermo_cool_background),
DeviceTypes.TYPE_LIGHT
to Pair(R.color.light_foreground, R.color.control_enabled_light_background)
).withDefault {
Pair(R.color.control_foreground, R.color.control_enabled_default_background)
}
private val deviceIconMap = mapOf<Int, IconState>(
THERMOSTAT_RANGE to IconState(
R.drawable.ic_device_thermostat_off,
R.drawable.ic_device_thermostat_on
),
(THERMOSTAT_RANGE + TemperatureControlTemplate.MODE_OFF) to IconState(
R.drawable.ic_device_thermostat_off,
R.drawable.ic_device_thermostat_on
),
(THERMOSTAT_RANGE + TemperatureControlTemplate.MODE_HEAT) to IconState(
R.drawable.ic_device_thermostat_off,
R.drawable.ic_device_thermostat_on
),
(THERMOSTAT_RANGE + TemperatureControlTemplate.MODE_COOL) to IconState(
R.drawable.ic_device_thermostat_off,
R.drawable.ic_device_thermostat_on
),
(THERMOSTAT_RANGE + TemperatureControlTemplate.MODE_HEAT_COOL) to IconState(
R.drawable.ic_device_thermostat_off,
R.drawable.ic_device_thermostat_on
),
(THERMOSTAT_RANGE + TemperatureControlTemplate.MODE_ECO) to IconState(
R.drawable.ic_device_thermostat_off,
R.drawable.ic_device_thermostat_on
),
DeviceTypes.TYPE_THERMOSTAT to IconState(
R.drawable.ic_device_thermostat_off,
R.drawable.ic_device_thermostat_on
),
DeviceTypes.TYPE_LIGHT to IconState(
R.drawable.ic_device_light_off,
R.drawable.ic_device_light_on
),
DeviceTypes.TYPE_CAMERA to IconState(
R.drawable.ic_device_camera_off,
R.drawable.ic_device_camera_on
),
DeviceTypes.TYPE_LOCK to IconState(
R.drawable.ic_device_lock_off,
R.drawable.ic_device_lock_on
),
DeviceTypes.TYPE_SWITCH to IconState(
R.drawable.ic_device_switch_off,
R.drawable.ic_device_switch_on
),
DeviceTypes.TYPE_OUTLET to IconState(
R.drawable.ic_device_outlet_off,
R.drawable.ic_device_outlet_on
),
DeviceTypes.TYPE_VACUUM to IconState(
R.drawable.ic_device_vacuum_off,
R.drawable.ic_device_vacuum_on
),
DeviceTypes.TYPE_MOP to IconState(
R.drawable.ic_device_mop_off,
R.drawable.ic_device_mop_on
),
DeviceTypes.TYPE_AIR_FRESHENER to IconState(
R.drawable.ic_device_air_freshener_off,
R.drawable.ic_device_air_freshener_on
),
DeviceTypes.TYPE_AIR_PURIFIER to IconState(
R.drawable.ic_device_air_purifier_off,
R.drawable.ic_device_air_purifier_on
),
DeviceTypes.TYPE_FAN to IconState(
R.drawable.ic_device_fan_off,
R.drawable.ic_device_fan_on
),
DeviceTypes.TYPE_HOOD to IconState(
R.drawable.ic_device_hood_off,
R.drawable.ic_device_hood_on
),
DeviceTypes.TYPE_KETTLE to IconState(
R.drawable.ic_device_kettle_off,
R.drawable.ic_device_kettle_on
),
DeviceTypes.TYPE_MICROWAVE to IconState(
R.drawable.ic_device_microwave_off,
R.drawable.ic_device_microwave_on
),
DeviceTypes.TYPE_REMOTE_CONTROL to IconState(
R.drawable.ic_device_remote_control_off,
R.drawable.ic_device_remote_control_on
),
DeviceTypes.TYPE_SET_TOP to IconState(
R.drawable.ic_device_set_top_off,
R.drawable.ic_device_set_top_on
),
DeviceTypes.TYPE_STYLER to IconState(
R.drawable.ic_device_styler_off,
R.drawable.ic_device_styler_on
),
DeviceTypes.TYPE_TV to IconState(
R.drawable.ic_device_tv_off,
R.drawable.ic_device_tv_on
),
DeviceTypes.TYPE_WATER_HEATER to IconState(
R.drawable.ic_device_water_heater_off,
R.drawable.ic_device_water_heater_on
),
DeviceTypes.TYPE_DISHWASHER to IconState(
R.drawable.ic_device_dishwasher_off,
R.drawable.ic_device_dishwasher_on
),
DeviceTypes.TYPE_MULTICOOKER to IconState(
R.drawable.ic_device_multicooker_off,
R.drawable.ic_device_multicooker_on
),
DeviceTypes.TYPE_SPRINKLER to IconState(
R.drawable.ic_device_sprinkler_off,
R.drawable.ic_device_sprinkler_on
),
DeviceTypes.TYPE_WASHER to IconState(
R.drawable.ic_device_washer_off,
R.drawable.ic_device_washer_on
),
DeviceTypes.TYPE_BLINDS to IconState(
R.drawable.ic_device_blinds_off,
R.drawable.ic_device_blinds_on
),
DeviceTypes.TYPE_DRAWER to IconState(
R.drawable.ic_device_drawer_off,
R.drawable.ic_device_drawer_on
),
DeviceTypes.TYPE_GARAGE to IconState(
R.drawable.ic_device_garage_off,
R.drawable.ic_device_garage_on
),
DeviceTypes.TYPE_GATE to IconState(
R.drawable.ic_device_gate_off,
R.drawable.ic_device_gate_on
),
DeviceTypes.TYPE_PERGOLA to IconState(
R.drawable.ic_device_pergola_off,
R.drawable.ic_device_pergola_on
),
DeviceTypes.TYPE_WINDOW to IconState(
R.drawable.ic_device_window_off,
R.drawable.ic_device_window_on
),
DeviceTypes.TYPE_VALVE to IconState(
R.drawable.ic_device_valve_off,
R.drawable.ic_device_valve_on
),
DeviceTypes.TYPE_SECURITY_SYSTEM to IconState(
R.drawable.ic_device_security_system_off,
R.drawable.ic_device_security_system_on
),
DeviceTypes.TYPE_REFRIGERATOR to IconState(
R.drawable.ic_device_refrigerator_off,
R.drawable.ic_device_refrigerator_on
),
DeviceTypes.TYPE_DOORBELL to IconState(
R.drawable.ic_device_doorbell_off,
R.drawable.ic_device_doorbell_on
),
DeviceTypes.TYPE_ROUTINE to IconState(
RenderInfo.APP_ICON_ID,
RenderInfo.APP_ICON_ID
),
DeviceTypes.TYPE_AC_HEATER to IconState(
R.drawable.ic_device_thermostat_off,
R.drawable.ic_device_thermostat_on
),
DeviceTypes.TYPE_AC_UNIT to IconState(
R.drawable.ic_device_thermostat_off,
R.drawable.ic_device_thermostat_on
),
DeviceTypes.TYPE_COFFEE_MAKER to IconState(
R.drawable.ic_device_kettle_off,
R.drawable.ic_device_kettle_on
),
DeviceTypes.TYPE_DEHUMIDIFIER to IconState(
R.drawable.ic_device_air_freshener_off,
R.drawable.ic_device_air_freshener_on
),
DeviceTypes.TYPE_RADIATOR to IconState(
R.drawable.ic_device_thermostat_off,
R.drawable.ic_device_thermostat_on
),
DeviceTypes.TYPE_STANDMIXER to IconState(
R.drawable.ic_device_cooking_off,
R.drawable.ic_device_cooking_on
),
DeviceTypes.TYPE_DISPLAY to IconState(
R.drawable.ic_device_display_off,
R.drawable.ic_device_display_on
),
DeviceTypes.TYPE_DRYER to IconState(
R.drawable.ic_device_washer_off,
R.drawable.ic_device_washer_on
),
DeviceTypes.TYPE_MOWER to IconState(
R.drawable.ic_device_outdoor_garden_off,
R.drawable.ic_device_outdoor_garden_on
),
DeviceTypes.TYPE_SHOWER to IconState(
R.drawable.ic_device_water_off,
R.drawable.ic_device_water_on
),
DeviceTypes.TYPE_AWNING to IconState(
R.drawable.ic_device_pergola_off,
R.drawable.ic_device_pergola_on
),
DeviceTypes.TYPE_CLOSET to IconState(
R.drawable.ic_device_drawer_off,
R.drawable.ic_device_drawer_on
),
DeviceTypes.TYPE_CURTAIN to IconState(
R.drawable.ic_device_blinds_off,
R.drawable.ic_device_blinds_on
),
DeviceTypes.TYPE_DOOR to IconState(
R.drawable.ic_device_door_off,
R.drawable.ic_device_door_on
),
DeviceTypes.TYPE_SHUTTER to IconState(
R.drawable.ic_device_window_off,
R.drawable.ic_device_window_on
),
DeviceTypes.TYPE_HEATER to IconState(
R.drawable.ic_device_thermostat_off,
R.drawable.ic_device_thermostat_on
)
).withDefault {
IconState(
R.drawable.ic_device_unknown_off,
R.drawable.ic_device_unknown_on
)
}