Home | History | Annotate | Download | only in ui
      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.support.annotation.IntDef;
     22 import android.util.AttributeSet;
     23 import android.util.Pair;
     24 import android.view.View;
     25 import android.widget.ImageView;
     26 import android.widget.LinearLayout;
     27 import com.android.car.hvac.R;
     28 
     29 import java.util.HashMap;
     30 import java.util.Map;
     31 
     32 /**
     33  * A set of buttons that controls the fan direction of the vehicle. Turning on one state will
     34  * turn off the other states.
     35  */
     36 public class FanDirectionButtons extends LinearLayout {
     37     public static final int FAN_DIRECTION_FACE = 0;
     38     public static final int FAN_DIRECTION_FACE_FLOOR = 1;
     39     public static final int FAN_DIRECTION_FLOOR = 2;
     40     public static final int FAN_DIRECTION_FLOOR_DEFROSTER = 3;
     41 
     42     @IntDef({FAN_DIRECTION_FACE, FAN_DIRECTION_FACE_FLOOR,
     43             FAN_DIRECTION_FLOOR, FAN_DIRECTION_FLOOR_DEFROSTER})
     44     public @interface FanDirection {}
     45 
     46     /**
     47      * A listener that is notified when a fan direction button has been clicked.
     48      */
     49     public interface FanDirectionClickListener {
     50         void onFanDirectionClicked(@FanDirection int direction);
     51     }
     52 
     53     private static final float UNSELECTED_BUTTON_ALPHA = 0.5f;
     54     private static final float SELECTED_BUTTON_ALPHA = 1.0f;
     55 
     56     private final Map<ImageView, Pair<Drawable, Drawable>> mFanMap = new HashMap<>();
     57     private final Map<ImageView, Integer> mControlMap = new HashMap<>();
     58 
     59     private FanDirectionClickListener mListener;
     60 
     61     public FanDirectionButtons(Context context) {
     62         super(context);
     63         init();
     64     }
     65 
     66     public FanDirectionButtons(Context context, AttributeSet attrs) {
     67         super(context, attrs);
     68         init();
     69     }
     70 
     71     public FanDirectionButtons(Context context, AttributeSet attrs, int defStyleAttr) {
     72         super(context, attrs, defStyleAttr);
     73         init();
     74     }
     75 
     76     public void setFanDirectionClickListener(FanDirectionClickListener listener) {
     77         mListener = listener;
     78     }
     79 
     80     private void init() {
     81         inflate(getContext(), R.layout.fan_direction, this);
     82     }
     83 
     84     @Override
     85     protected void onFinishInflate() {
     86         super.onFinishInflate();
     87         Resources res = getResources();
     88 
     89         setOrientation(HORIZONTAL);
     90 
     91         ImageView directionButton1 = (ImageView) findViewById(R.id.direction_1);
     92         ImageView directionButton2 = (ImageView) findViewById(R.id.direction_2);
     93         ImageView directionButton3 = (ImageView) findViewById(R.id.direction_3);
     94         ImageView directionButton4 = (ImageView) findViewById(R.id.direction_4);
     95 
     96         Drawable directionOn1 = res.getDrawable(R.drawable.ic_fan_direction_1_on);
     97         Drawable directionOn2 = res.getDrawable(R.drawable.ic_fan_direction_2_on);
     98         Drawable directionOn3 = res.getDrawable(R.drawable.ic_fan_direction_3_on);
     99         Drawable directionOn4 = res.getDrawable(R.drawable.ic_fan_direction_4_on);
    100 
    101         Drawable directionOff1 = res.getDrawable(R.drawable.ic_fan_direction_1_off);
    102         Drawable directionOff2 = res.getDrawable(R.drawable.ic_fan_direction_2_off);
    103         Drawable directionOff3 = res.getDrawable(R.drawable.ic_fan_direction_3_off);
    104         Drawable directionOff4 = res.getDrawable(R.drawable.ic_fan_direction_4_off);
    105 
    106         mFanMap.put(directionButton1, new Pair(directionOn1, directionOff1));
    107         mFanMap.put(directionButton2, new Pair(directionOn2, directionOff2));
    108         mFanMap.put(directionButton3, new Pair(directionOn3, directionOff3));
    109         mFanMap.put(directionButton4, new Pair(directionOn4, directionOff4));
    110 
    111         mControlMap.put(directionButton1, FAN_DIRECTION_FACE);
    112         mControlMap.put(directionButton2, FAN_DIRECTION_FACE_FLOOR);
    113         mControlMap.put(directionButton3, FAN_DIRECTION_FLOOR);
    114         mControlMap.put(directionButton4, FAN_DIRECTION_FLOOR_DEFROSTER);
    115 
    116         for (ImageView v : mFanMap.keySet()) {
    117             v.setOnClickListener(mFanDirectionClickListener);
    118         }
    119     }
    120 
    121     private final OnClickListener mFanDirectionClickListener = new OnClickListener() {
    122         @Override
    123         public void onClick(View v) {
    124             resetFanToOff();
    125             v.setAlpha(SELECTED_BUTTON_ALPHA);
    126             if (mFanMap.containsKey(v)) {
    127                 ((ImageView) v).setImageDrawable(mFanMap.get(v).first);
    128                 v.setAlpha(SELECTED_BUTTON_ALPHA);
    129                 @FanDirection int direction = mControlMap.get(v);
    130                 mListener.onFanDirectionClicked(direction);
    131             }
    132         }
    133     };
    134 
    135     private void resetFanToOff() {
    136         for (Map.Entry<ImageView, Pair<Drawable, Drawable>> entry : mFanMap.entrySet()) {
    137             ImageView button = entry.getKey();
    138             button.setImageDrawable(entry.getValue().second);
    139             button.setAlpha(UNSELECTED_BUTTON_ALPHA);
    140         }
    141     }
    142 }
    143