ModePicker.java revision 0e7b1301af5775c41827b9de0822566a91ea0c4f
1/*
2 * Copyright (C) 2011 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
17package com.android.camera;
18
19import com.android.camera.ui.RotateImageView;
20
21import android.content.Context;
22import android.graphics.PorterDuff;
23import android.graphics.drawable.Drawable;
24import android.util.AttributeSet;
25import android.view.View;
26import android.widget.ImageView;
27import android.widget.RelativeLayout;
28
29/**
30 * A widget that includes three mode selections {@code RotateImageView}'s and
31 * a current mode indicator.
32 */
33public class ModePicker extends RelativeLayout implements View.OnClickListener {
34    public static final int MODE_PANORAMA = 0;
35    public static final int MODE_VIDEO = 1;
36    public static final int MODE_CAMERA = 2;
37
38    /** A callback to be called when the user wants to switch activity. */
39    public interface OnModeChangeListener {
40        // Returns true if the listener agrees that the mode can be changed.
41        public boolean onModeChanged(int newMode);
42    }
43
44    private final int DISABLED_COLOR;
45
46    private OnModeChangeListener mListener;
47    private View mModeIcons[] = new View[3];
48    private View mCurrentModeIcon;
49    private View mModeSelection;
50    private int mCurrentMode = MODE_CAMERA;
51    private Context mContext;
52
53    public ModePicker(Context context, AttributeSet attrs) {
54        super(context, attrs);
55        mContext = context;
56        DISABLED_COLOR = context.getResources().getColor(R.color.icon_disabled_color);
57    }
58
59    protected void onFinishInflate() {
60        super.onFinishInflate();
61
62        mModeSelection = findViewById(R.id.mode_selection);
63
64        mCurrentModeIcon = findViewById(R.id.current_mode);
65        mCurrentModeIcon.setOnClickListener(this);
66
67        mModeIcons[MODE_PANORAMA] = findViewById(R.id.mode_panorama);
68        mModeIcons[MODE_VIDEO] = findViewById(R.id.mode_video);
69        mModeIcons[MODE_CAMERA] = findViewById(R.id.mode_camera);
70    }
71
72    private void enableModeSelection(boolean enabled) {
73        mCurrentModeIcon.setVisibility(enabled ? View.GONE : View.VISIBLE);
74        mCurrentModeIcon.setOnClickListener(enabled ? null : this);
75        mModeSelection.setVisibility(enabled ? View.VISIBLE : View.GONE);
76        for (int i = 0; i < 3; ++i) {
77            mModeIcons[i].setOnClickListener(enabled ? this : null);
78            highlightCurrentMode(mModeIcons[i], (i == mCurrentMode));
79        }
80    }
81
82    public void onClick(View view) {
83        for (int i = 0; i < 3; ++i) {
84            if (view == mModeIcons[i]) {
85                setCurrentMode(i);
86                enableModeSelection(false);
87                return;
88            }
89        }
90        if (view == mCurrentModeIcon) enableModeSelection(true);
91    }
92
93    private void setMode(int mode) {
94        for (int i = 0; i < 3; ++i) mModeIcons[i].setSelected(mode == i);
95    }
96
97    public void setOnModeChangeListener(OnModeChangeListener listener) {
98        mListener = listener;
99    }
100
101    public void setCurrentMode(int mode) {
102        setMode(mode);
103        tryToSetMode(mode);
104    }
105
106    private void tryToSetMode(int mode) {
107        if (mListener != null) {
108            if (!mListener.onModeChanged(mode)) {
109                setMode(mCurrentMode);
110                return;
111            }
112        }
113        ((RotateImageView) mCurrentModeIcon).setImageDrawable(
114                ((RotateImageView) mModeIcons[mode]).getDrawable());
115        mCurrentMode = mode;
116    }
117
118    public boolean onModeChanged(int mode) {
119        setCurrentMode(mode);
120        return true;
121    }
122
123    public void setDegree(int degree) {
124        for (int i = 0 ; i < 3 ; ++i) {
125            ((RotateImageView) mModeIcons[i]).setDegree(degree);
126        }
127        ((RotateImageView) mCurrentModeIcon).setDegree(degree);
128    }
129
130    @Override
131    public void setEnabled(boolean enabled) {
132        super.setEnabled(enabled);
133    }
134
135    private void highlightCurrentMode(View view, boolean enabled) {
136        Drawable drawable = ((ImageView) view).getDrawable();
137        if (enabled) {
138            drawable.clearColorFilter();
139        } else {
140            drawable.setColorFilter(DISABLED_COLOR, PorterDuff.Mode.SRC_ATOP);
141        }
142    }
143
144    public void setEnabled(View view, boolean enabled) {
145        view.setEnabled(enabled);
146
147        // render disabled effect for tablet only.
148        if (!Util.isTabletUI()) return;
149
150        Drawable drawable = ((ImageView) view).getDrawable();
151        if (enabled) {
152            drawable.clearColorFilter();
153        } else {
154            drawable.setColorFilter(DISABLED_COLOR, PorterDuff.Mode.SRC_ATOP);
155        }
156    }
157}
158