ButtonManager.java revision 8a2933b2c0156b752425b499f3081e4ffc350061
1/*
2 * Copyright (C) 2013 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 android.app.Activity;
20import android.content.Context;
21import android.util.Log;
22import android.view.View;
23import android.widget.ImageButton;
24
25import com.android.camera.settings.SettingsManager;
26import com.android.camera2.R;
27
28import java.util.ArrayList;
29import java.util.List;
30
31/**
32 * A  class for generating pre-initialized
33 * {@link #android.widget.ImageButton}s.
34 */
35public class ButtonManager {
36
37    public static final int BUTTON_FLASH = 0;
38    public static final int BUTTON_CAMERA = 1;
39    public static final int BUTTON_HDRPLUS = 2;
40
41    /** A reference to the activity for finding button views on demand. */
42    private CameraActivity mActivity;
43    /** A reference to the application's settings manager. */
44    private SettingsManager mSettingsManager;
45
46    /**
47     * Get a new global ButtonManager.
48     */
49    public ButtonManager(CameraActivity activity) {
50        mActivity = activity;
51        mSettingsManager = activity.getSettingsManager();
52    }
53
54    /**
55     * A callback executed in the state listener of a button.
56     * Used by a module to set specific behavior when a button's
57     * state changes.
58     */
59    public interface ButtonCallback {
60        public void onStateChanged(int state);
61    }
62
63    private MultiToggleImageButton getButtonOrError(int buttonId, int resId) {
64        MultiToggleImageButton button
65            = (MultiToggleImageButton) mActivity.findViewById(resId);
66        if (button == null) {
67            switch (buttonId) {
68                case BUTTON_FLASH:
69                    throw new IllegalStateException("Flash button could not be found.");
70                case BUTTON_CAMERA:
71                    throw new IllegalStateException("Camera button could not be found.");
72                case BUTTON_HDRPLUS:
73                    throw new IllegalStateException("Hdr button could not be found.");
74                default:
75                    throw new IllegalArgumentException("button not known by id=" + buttonId);
76            }
77        }
78        return button;
79    }
80
81    /**
82     * Enable a known button by id, with a state change callback and
83     * a resource id that points to an array of drawables.
84     */
85    public void enableButton(int buttonId, int resId, ButtonCallback cb, int resIdImages) {
86        MultiToggleImageButton button = getButtonOrError(buttonId, resId);
87        switch (buttonId) {
88            case BUTTON_FLASH:
89                enableFlashButton(button, cb, resIdImages);
90                break;
91            case BUTTON_CAMERA:
92                enableCameraButton(button, cb, resIdImages);
93                break;
94            case BUTTON_HDRPLUS:
95                enableHdrPlusButton(button, cb, resIdImages);
96                break;
97            default:
98                throw new IllegalArgumentException("button not known by id=" + buttonId);
99        }
100        button.setVisibility(View.VISIBLE);
101    }
102
103    /**
104     * Disable a known button by id.
105     */
106    public void disableButton(int buttonId, int resId) {
107        MultiToggleImageButton button = getButtonOrError(buttonId, resId);
108        button.setVisibility(View.INVISIBLE);
109    }
110
111    /**
112     * Enable a flash button.
113     */
114    private void enableFlashButton(MultiToggleImageButton button,
115            final ButtonCallback cb, int resIdImages) {
116
117        if (resIdImages > 0) {
118            button.overrideImageIds(resIdImages);
119        }
120        int index = mSettingsManager.getStringValueIndex(SettingsManager.SETTING_FLASH_MODE);
121        if (index >= 0) {
122            button.setState(index, false);
123        }
124        button.setOnStateChangeListener(new MultiToggleImageButton.OnStateChangeListener() {
125                @Override
126                public void stateChanged(View view, int state) {
127                    mSettingsManager.setStringValueIndex(SettingsManager.SETTING_FLASH_MODE, state);
128                    if (cb != null) {
129                        cb.onStateChanged(state);
130                    }
131                }
132            });
133    }
134
135    /**
136     * Enable a camera button.
137     */
138    private void enableCameraButton(MultiToggleImageButton button,
139            final ButtonCallback cb, int resIdImages) {
140
141        if (resIdImages > 0) {
142            button.overrideImageIds(resIdImages);
143        }
144
145        int index = mSettingsManager.getStringValueIndex(SettingsManager.SETTING_CAMERA_ID);
146        if (index >= 0) {
147            button.setState(index, false);
148        }
149
150        button.setOnStateChangeListener(new MultiToggleImageButton.OnStateChangeListener() {
151                @Override
152                public void stateChanged(View view, int state) {
153                    mSettingsManager.setStringValueIndex(SettingsManager.SETTING_CAMERA_ID, state);
154                    int cameraId = Integer.parseInt(mSettingsManager.get(
155                        SettingsManager.SETTING_CAMERA_ID));
156                    if (cb != null) {
157                        cb.onStateChanged(cameraId);
158                    }
159                }
160            });
161    }
162
163    /**
164     * Enable an hdr plus button.
165     */
166    private void enableHdrPlusButton(MultiToggleImageButton button,
167            final ButtonCallback cb, int resIdImages) {
168
169        if (resIdImages > 0) {
170            button.overrideImageIds(resIdImages);
171        }
172
173        int index = mSettingsManager.getStringValueIndex(SettingsManager.SETTING_CAMERA_HDR);
174        if (index >= 0) {
175            button.setState(index, false);
176        }
177
178        button.setOnStateChangeListener(new MultiToggleImageButton.OnStateChangeListener() {
179                @Override
180                public void stateChanged(View view, int state) {
181                    mSettingsManager.setStringValueIndex(SettingsManager.SETTING_CAMERA_HDR, state);
182                    if (cb != null) {
183                        cb.onStateChanged(state);
184                    }
185                }
186            });
187    }
188}