ModeIconView.java revision 0496fcaa51f88f6c753975473b971941e4090cfa
1213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu/*
2213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu * Copyright (C) 2014 The Android Open Source Project
3213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu *
4213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu * Licensed under the Apache License, Version 2.0 (the "License");
5213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu * you may not use this file except in compliance with the License.
6213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu * You may obtain a copy of the License at
7213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu *
8213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu *      http://www.apache.org/licenses/LICENSE-2.0
9213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu *
10213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu * Unless required by applicable law or agreed to in writing, software
11213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu * distributed under the License is distributed on an "AS IS" BASIS,
12213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu * See the License for the specific language governing permissions and
14213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu * limitations under the License.
15213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu */
16213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu
17213a4a086b54904cee543adf60b16fc1a61efe38Doris Liupackage com.android.camera.ui;
18213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu
19213a4a086b54904cee543adf60b16fc1a61efe38Doris Liuimport android.content.Context;
20213a4a086b54904cee543adf60b16fc1a61efe38Doris Liuimport android.graphics.Canvas;
21040e3c053cc0d2097332de24cf5328a26a8e7332Doris Liuimport android.graphics.drawable.Drawable;
22213a4a086b54904cee543adf60b16fc1a61efe38Doris Liuimport android.graphics.drawable.GradientDrawable;
23213a4a086b54904cee543adf60b16fc1a61efe38Doris Liuimport android.util.AttributeSet;
24040e3c053cc0d2097332de24cf5328a26a8e7332Doris Liuimport android.view.View;
25213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu
26213a4a086b54904cee543adf60b16fc1a61efe38Doris Liuimport com.android.camera2.R;
27213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu
28213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu/**
29213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu * This class encapsulates the logic of drawing different states of the icon in
30213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu * mode drawer for when it is highlighted (to indicate the current module), or when
31213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu * it is selected by the user. It handles the internal state change like a state
32213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu * list drawable. The advantage over a state list drawable is that in the class
33213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu * multiple states can be rendered using the same drawable with some color modification,
34213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu * whereas a state list drawable would require a different drawable for each state.
35213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu */
36040e3c053cc0d2097332de24cf5328a26a8e7332Doris Liupublic class ModeIconView extends View {
37213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu    private boolean mHighlightIsOn = false;
38213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu    private final GradientDrawable mBackground;
390496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague    private final GradientDrawable mHoverDrawable;
400496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague
41213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu    private final int mIconBackgroundSize;
42213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu    private int mHighlightColor;
43213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu    private final int mBackgroundDefaultColor;
44040e3c053cc0d2097332de24cf5328a26a8e7332Doris Liu    private final int mIconDrawableSize;
45040e3c053cc0d2097332de24cf5328a26a8e7332Doris Liu    private Drawable mIconDrawable = null;
4606e0826c3ae8579bd301040607701e0065aa6848Doris Liu    private boolean mSelected = false;
47213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu
48213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu    public ModeIconView(Context context, AttributeSet attrs) {
49213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu        super(context, attrs);
50213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu        mBackgroundDefaultColor = getResources().getColor(R.color.mode_selector_icon_background);
51213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu        mIconBackgroundSize = getResources().getDimensionPixelSize(
52213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu                R.dimen.mode_selector_icon_block_width);
53213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu        mBackground = (GradientDrawable) getResources()
54213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu                .getDrawable(R.drawable.mode_icon_background).mutate();
55213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu        mBackground.setBounds(0, 0, mIconBackgroundSize, mIconBackgroundSize);
560496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague        mHoverDrawable = (GradientDrawable) getResources()
5706e0826c3ae8579bd301040607701e0065aa6848Doris Liu                .getDrawable(R.drawable.mode_icon_background).mutate();
580496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague        mHoverDrawable.setBounds(0, 0, mIconBackgroundSize, mIconBackgroundSize);
59040e3c053cc0d2097332de24cf5328a26a8e7332Doris Liu        mIconDrawableSize = getResources().getDimensionPixelSize(
60040e3c053cc0d2097332de24cf5328a26a8e7332Doris Liu                R.dimen.mode_selector_icon_drawable_size);
610496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague
620496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague        mHoverDrawable.setColor(getResources().getColor(R.color.mode_icon_hover_highlight));
63040e3c053cc0d2097332de24cf5328a26a8e7332Doris Liu    }
64040e3c053cc0d2097332de24cf5328a26a8e7332Doris Liu
65040e3c053cc0d2097332de24cf5328a26a8e7332Doris Liu    /**
66040e3c053cc0d2097332de24cf5328a26a8e7332Doris Liu     * Sets the drawable that shows the icon of the mode.
67040e3c053cc0d2097332de24cf5328a26a8e7332Doris Liu     *
68040e3c053cc0d2097332de24cf5328a26a8e7332Doris Liu     * @param drawable drawable of the mode icon
69040e3c053cc0d2097332de24cf5328a26a8e7332Doris Liu     */
70040e3c053cc0d2097332de24cf5328a26a8e7332Doris Liu    public void setIconDrawable(Drawable drawable) {
71040e3c053cc0d2097332de24cf5328a26a8e7332Doris Liu        mIconDrawable = drawable;
720496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague
73040e3c053cc0d2097332de24cf5328a26a8e7332Doris Liu        // Center icon in the background.
74040e3c053cc0d2097332de24cf5328a26a8e7332Doris Liu        if (mIconDrawable != null) {
75040e3c053cc0d2097332de24cf5328a26a8e7332Doris Liu            mIconDrawable.setBounds(mIconBackgroundSize / 2 - mIconDrawableSize / 2,
76040e3c053cc0d2097332de24cf5328a26a8e7332Doris Liu                    mIconBackgroundSize / 2 - mIconDrawableSize / 2,
77040e3c053cc0d2097332de24cf5328a26a8e7332Doris Liu                    mIconBackgroundSize / 2 + mIconDrawableSize / 2,
78040e3c053cc0d2097332de24cf5328a26a8e7332Doris Liu                    mIconBackgroundSize / 2 + mIconDrawableSize / 2);
79040e3c053cc0d2097332de24cf5328a26a8e7332Doris Liu            invalidate();
80040e3c053cc0d2097332de24cf5328a26a8e7332Doris Liu        }
81213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu    }
82213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu
83213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu    @Override
84213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu    public void draw(Canvas canvas) {
85040e3c053cc0d2097332de24cf5328a26a8e7332Doris Liu        super.draw(canvas);
8606e0826c3ae8579bd301040607701e0065aa6848Doris Liu        if (mHighlightIsOn && !mSelected) {
870496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague            mHoverDrawable.draw(canvas);
8806e0826c3ae8579bd301040607701e0065aa6848Doris Liu        } else {
8906e0826c3ae8579bd301040607701e0065aa6848Doris Liu            mBackground.draw(canvas);
90213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu        }
91040e3c053cc0d2097332de24cf5328a26a8e7332Doris Liu        if (mIconDrawable != null) {
92040e3c053cc0d2097332de24cf5328a26a8e7332Doris Liu            mIconDrawable.draw(canvas);
93040e3c053cc0d2097332de24cf5328a26a8e7332Doris Liu        }
940496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague    }
95040e3c053cc0d2097332de24cf5328a26a8e7332Doris Liu
960496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague    /**
970496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague     * @return A clone of the icon drawable associated with this view.
980496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague     */
990496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague    public Drawable getIconDrawableClone() {
1000496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague        return mIconDrawable.getConstantState().newDrawable();
1010496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague    }
1020496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague
1030496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague    /**
1040496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague     * @return The size of the icon drawable.
1050496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague     */
1060496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague    public int getIconDrawableSize() {
1070496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague        return mIconDrawableSize;
108213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu    }
109213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu
110213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu    /**
111213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu     * This gets called when the selected state is changed. When selected, the background
112213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu     * drawable will use a solid pre-defined color to indicate selection.
113213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu     *
114213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu     * @param selected true when selected, false otherwise.
115213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu     */
1160496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague    @Override
117213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu    public void setSelected(boolean selected) {
118213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu        if (selected) {
119213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu            mBackground.setColor(mHighlightColor);
120213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu            mHighlightIsOn = false;
121213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu        } else {
122213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu            mBackground.setColor(mBackgroundDefaultColor);
123213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu        }
1240496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague
12506e0826c3ae8579bd301040607701e0065aa6848Doris Liu        mSelected = selected;
126213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu        invalidate();
127213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu    }
128213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu
129213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu    /**
130213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu     * This gets called when the highlighted state is changed. When highlighted,
131213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu     * a ring shaped drawable of a solid pre-defined color will be drawn on top
132213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu     * of the background drawable to indicate highlight state.
133213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu     *
134213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu     * @param highlighted true when highlighted, false otherwise.
135213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu     */
136213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu    public void setHighlighted(boolean highlighted) {
137213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu        mHighlightIsOn = highlighted;
138213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu        invalidate();
139213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu    }
140213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu
141213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu    /**
142213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu     * Sets the color that will be used in the drawable for highlight state.
143213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu     *
144213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu     * @param highlightColor color for the highlight state
145213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu     */
146213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu    public void setHighlightColor(int highlightColor) {
147213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu        mHighlightColor = highlightColor;
1480496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague    }
1490496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague
1500496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague    /**
1510496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague     * @return The highlightColor color the the highlight state.
1520496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague     */
1530496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague    public int getHighlightColor() {
1540496fcaa51f88f6c753975473b971941e4090cfaSpike Sprague        return mHighlightColor;
155213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu    }
156213a4a086b54904cee543adf60b16fc1a61efe38Doris Liu}
157