1 /*
2  * Copyright (c) 2016, The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.android.car.hvac.ui;
17 
18 import android.content.Context;
19 import android.content.res.Resources;
20 import android.graphics.drawable.Drawable;
21 import android.util.AttributeSet;
22 import android.view.View;
23 import android.widget.ImageView;
24 
25 import androidx.annotation.IntDef;
26 
27 import com.android.car.hvac.R;
28 
29 /**
30  * A seat warmer button that has 3 heating levels.
31  */
32 public class SeatWarmerButton extends ImageView {
33     public static final int HEAT_OFF = 0;
34     public static final int HEAT_LEVEL_ONE = 1;
35     public static final int HEAT_LEVEL_TWO = 2;
36     public static final int HEAT_LEVEL_THREE = 3;
37 
38     public interface SeatWarmerButtonClickListener{
onSeatWarmerButtonClicked(@eatingLevel int level)39         void onSeatWarmerButtonClicked(@HeatingLevel int level);
40     }
41 
42     @IntDef({HEAT_OFF, HEAT_LEVEL_ONE, HEAT_LEVEL_TWO, HEAT_LEVEL_THREE})
43     public @interface HeatingLevel {}
44 
45     private @HeatingLevel int mCurrentHeatSetting;
46 
47     private final Drawable mStateDrawables[] = new Drawable[4];
48 
49     private SeatWarmerButtonClickListener mListener;
50 
SeatWarmerButton(Context context)51     public SeatWarmerButton(Context context) {
52         super(context);
53         init();
54     }
55 
SeatWarmerButton(Context context, AttributeSet attrs)56     public SeatWarmerButton(Context context, AttributeSet attrs) {
57         super(context, attrs);
58         init();
59     }
60 
SeatWarmerButton(Context context, AttributeSet attrs, int defStyleAttr)61     public SeatWarmerButton(Context context, AttributeSet attrs, int defStyleAttr) {
62         super(context, attrs, defStyleAttr);
63         init();
64     }
65 
init()66     private void init() {
67         Resources res = getResources();
68         mStateDrawables[0] = res.getDrawable(R.drawable.ic_seat_heat_off);
69         mStateDrawables[1] = res.getDrawable(R.drawable.ic_seat_heat_level_1);
70         mStateDrawables[2] = res.getDrawable(R.drawable.ic_seat_heat_level_2);
71         mStateDrawables[3] = res.getDrawable(R.drawable.ic_seat_heat_level_3);
72 
73         setOnClickListener(new OnClickListener() {
74             @Override
75             public void onClick(View v) {
76                 mCurrentHeatSetting = getNextHeatSetting(mCurrentHeatSetting);
77                 Drawable d = getDrawableForState(mCurrentHeatSetting);
78                 setImageDrawable(d);
79                 if (mListener != null) {
80                     mListener.onSeatWarmerButtonClicked(mCurrentHeatSetting);
81                 }
82             }
83         });
84     }
85 
setSeatWarmerClickListener(SeatWarmerButtonClickListener listener)86     public void setSeatWarmerClickListener(SeatWarmerButtonClickListener listener) {
87         mListener = listener;
88     }
89 
setHeatLevel(@eatingLevel int level)90     public void setHeatLevel(@HeatingLevel int level) {
91         mCurrentHeatSetting = level;
92         setImageDrawable(getDrawableForState(mCurrentHeatSetting));
93     }
94 
getDrawableForState(@eatingLevel int level)95     private Drawable getDrawableForState(@HeatingLevel int level) {
96         switch (level) {
97             case HEAT_LEVEL_ONE:
98                 return mStateDrawables[1];
99             case HEAT_LEVEL_TWO:
100                 return mStateDrawables[2];
101             case HEAT_LEVEL_THREE:
102                 return mStateDrawables[3];
103             case HEAT_OFF:
104             default:
105                 return mStateDrawables[0];
106         }
107     }
108 
getNextHeatSetting(@eatingLevel int level)109     private @HeatingLevel int getNextHeatSetting(@HeatingLevel int level) {
110         switch (level) {
111             case HEAT_OFF:
112                 return HEAT_LEVEL_ONE;
113             case HEAT_LEVEL_ONE:
114                 return HEAT_LEVEL_TWO;
115             case HEAT_LEVEL_TWO:
116                 return HEAT_LEVEL_THREE;
117             case HEAT_LEVEL_THREE:
118                 return HEAT_OFF;
119             default:
120                 return HEAT_OFF;
121         }
122     }
123 }
124