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 */
16package com.android.car.hvac.ui;
17
18import android.content.Context;
19import android.content.res.Resources;
20import android.graphics.drawable.Drawable;
21import android.support.annotation.IntDef;
22import android.util.AttributeSet;
23import android.view.View;
24import android.widget.ImageView;
25import com.android.car.hvac.R;
26
27/**
28 * A seat warmer button that has 3 heating levels.
29 */
30public class SeatWarmerButton extends ImageView {
31    public static final int HEAT_OFF = 0;
32    public static final int HEAT_LEVEL_ONE = 1;
33    public static final int HEAT_LEVEL_TWO = 2;
34    public static final int HEAT_LEVEL_THREE = 3;
35
36    public interface SeatWarmerButtonClickListener{
37        void onSeatWarmerButtonClicked(@HeatingLevel int level);
38    }
39
40    @IntDef({HEAT_OFF, HEAT_LEVEL_ONE, HEAT_LEVEL_TWO, HEAT_LEVEL_THREE})
41    public @interface HeatingLevel {}
42
43    private @HeatingLevel int mCurrentHeatSetting;
44
45    private final Drawable mStateDrawables[] = new Drawable[4];
46
47    private SeatWarmerButtonClickListener mListener;
48
49    public SeatWarmerButton(Context context) {
50        super(context);
51        init();
52    }
53
54    public SeatWarmerButton(Context context, AttributeSet attrs) {
55        super(context, attrs);
56        init();
57    }
58
59    public SeatWarmerButton(Context context, AttributeSet attrs, int defStyleAttr) {
60        super(context, attrs, defStyleAttr);
61        init();
62    }
63
64    private void init() {
65        Resources res = getResources();
66        mStateDrawables[0] = res.getDrawable(R.drawable.ic_seat_heat_off);
67        mStateDrawables[1] = res.getDrawable(R.drawable.ic_seat_heat_level_1);
68        mStateDrawables[2] = res.getDrawable(R.drawable.ic_seat_heat_level_2);
69        mStateDrawables[3] = res.getDrawable(R.drawable.ic_seat_heat_level_3);
70
71        setOnClickListener(new OnClickListener() {
72            @Override
73            public void onClick(View v) {
74                mCurrentHeatSetting = getNextHeatSetting(mCurrentHeatSetting);
75                Drawable d = getDrawableForState(mCurrentHeatSetting);
76                setImageDrawable(d);
77                if (mListener != null) {
78                    mListener.onSeatWarmerButtonClicked(mCurrentHeatSetting);
79                }
80            }
81        });
82    }
83
84    public void setSeatWarmerClickListener(SeatWarmerButtonClickListener listener) {
85        mListener = listener;
86    }
87
88    public void setHeatLevel(@HeatingLevel int level) {
89        mCurrentHeatSetting = level;
90        setImageDrawable(getDrawableForState(mCurrentHeatSetting));
91    }
92
93    private Drawable getDrawableForState(@HeatingLevel int level) {
94        switch (level) {
95            case HEAT_LEVEL_ONE:
96                return mStateDrawables[1];
97            case HEAT_LEVEL_TWO:
98                return mStateDrawables[2];
99            case HEAT_LEVEL_THREE:
100                return mStateDrawables[3];
101            case HEAT_OFF:
102            default:
103                return mStateDrawables[0];
104        }
105    }
106
107    private @HeatingLevel int getNextHeatSetting(@HeatingLevel int level) {
108        switch (level) {
109            case HEAT_OFF:
110                return HEAT_LEVEL_ONE;
111            case HEAT_LEVEL_ONE:
112                return HEAT_LEVEL_TWO;
113            case HEAT_LEVEL_TWO:
114                return HEAT_LEVEL_THREE;
115            case HEAT_LEVEL_THREE:
116                return HEAT_OFF;
117            default:
118                return HEAT_OFF;
119        }
120    }
121}
122