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