IndicatorIconController.java revision 59345144c4bde59b81bb19c95cdd977c1d1a9cd4
1e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren/*
2e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren * Copyright (C) 2014 The Android Open Source Project
3e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren *
4e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren * Licensed under the Apache License, Version 2.0 (the "License");
5e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren * you may not use this file except in compliance with the License.
6e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren * You may obtain a copy of the License at
7e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren *
8e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren *      http://www.apache.org/licenses/LICENSE-2.0
9e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren *
10e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren * Unless required by applicable law or agreed to in writing, software
11e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren * distributed under the License is distributed on an "AS IS" BASIS,
12e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren * See the License for the specific language governing permissions and
14e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren * limitations under the License.
15e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren */
16e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren
17e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgrenpackage com.android.camera.widget;
18e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren
19e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgrenimport android.content.Context;
20e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgrenimport android.content.res.TypedArray;
21e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgrenimport android.graphics.drawable.Drawable;
22e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgrenimport android.view.View;
23e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgrenimport android.widget.ImageView;
24e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren
25e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgrenimport com.android.camera.ButtonManager;
26e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgrenimport com.android.camera.app.AppController;
275596b4c902dcb685928b43678f428746ca5ffd08Angus Kongimport com.android.camera.debug.Log;
28e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgrenimport com.android.camera.settings.SettingsManager;
29d706ea69a87229dca5cb8f16125decfbcbc5303dErin Dahlgrenimport com.android.camera.util.PhotoSphereHelper;
30e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgrenimport com.android.camera2.R;
31e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren
32e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren/**
33e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren * IndicatorIconController sets the visibility and icon state of
34e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren * on screen indicators.
35e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren *
36e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren * Indicators are only visible if they are in a non-default state.  The
37e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren * visibility of an indicator is set when an indicator's setting changes.
38e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren */
39e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgrenpublic class IndicatorIconController
40e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren    implements SettingsManager.OnSettingChangedListener,
41e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren               ButtonManager.ButtonStatusListener {
42e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren
435596b4c902dcb685928b43678f428746ca5ffd08Angus Kong    private final static Log.Tag TAG = new Log.Tag("IndicatorIconCtrlr");
44e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren
45e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren    private ImageView mFlashIndicator;
46e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren    private ImageView mHdrIndicator;
4771a742968e6b9efe2f570e2876f67330bfddf8c1Erin Dahlgren    private ImageView mPanoIndicator;
48e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren
49abf54e2994961395a0feb0b08353e62718443f23Spike Sprague    private ImageView mExposureIndicatorN2;
50abf54e2994961395a0feb0b08353e62718443f23Spike Sprague    private ImageView mExposureIndicatorN1;
51abf54e2994961395a0feb0b08353e62718443f23Spike Sprague    private ImageView mExposureIndicatorP1;
52abf54e2994961395a0feb0b08353e62718443f23Spike Sprague    private ImageView mExposureIndicatorP2;
53abf54e2994961395a0feb0b08353e62718443f23Spike Sprague
54e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren    private TypedArray mFlashIndicatorPhotoIcons;
55e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren    private TypedArray mFlashIndicatorVideoIcons;
56e7d745c15f1ee0f3a160e7601715e70f9646e6c0Erin Dahlgren    private TypedArray mHdrPlusIndicatorIcons;
57e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren    private TypedArray mHdrIndicatorIcons;
5871a742968e6b9efe2f570e2876f67330bfddf8c1Erin Dahlgren    private TypedArray mPanoIndicatorIcons;
596e07fe22cf84e9eea02d368bf64ab68d92401f20Erin Dahlgren
60e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren    private AppController mController;
61e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren
62e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren    public IndicatorIconController(AppController controller, View root) {
63e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren        mController = controller;
64e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren        Context context = controller.getAndroidContext();
65e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren
66e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren        mFlashIndicator = (ImageView) root.findViewById(R.id.flash_indicator);
67e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren        mFlashIndicatorPhotoIcons = context.getResources().obtainTypedArray(
68e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren            R.array.camera_flashmode_indicator_icons);
69e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren        mFlashIndicatorVideoIcons = context.getResources().obtainTypedArray(
70e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren            R.array.video_flashmode_indicator_icons);
7171a742968e6b9efe2f570e2876f67330bfddf8c1Erin Dahlgren
7271a742968e6b9efe2f570e2876f67330bfddf8c1Erin Dahlgren        mHdrIndicator = (ImageView) root.findViewById(R.id.hdr_indicator);
73e7d745c15f1ee0f3a160e7601715e70f9646e6c0Erin Dahlgren        mHdrPlusIndicatorIcons = context.getResources().obtainTypedArray(
74e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren            R.array.pref_camera_hdr_plus_indicator_icons);
75e7d745c15f1ee0f3a160e7601715e70f9646e6c0Erin Dahlgren        mHdrIndicatorIcons = context.getResources().obtainTypedArray(
76e7d745c15f1ee0f3a160e7601715e70f9646e6c0Erin Dahlgren            R.array.pref_camera_hdr_indicator_icons);
7771a742968e6b9efe2f570e2876f67330bfddf8c1Erin Dahlgren
7871a742968e6b9efe2f570e2876f67330bfddf8c1Erin Dahlgren        int panoIndicatorArrayId = PhotoSphereHelper.getPanoramaOrientationIndicatorArrayId();
7971a742968e6b9efe2f570e2876f67330bfddf8c1Erin Dahlgren        if (panoIndicatorArrayId > 0) {
8071a742968e6b9efe2f570e2876f67330bfddf8c1Erin Dahlgren            mPanoIndicator = (ImageView) root.findViewById(R.id.pano_indicator);
8171a742968e6b9efe2f570e2876f67330bfddf8c1Erin Dahlgren            mPanoIndicatorIcons =
8271a742968e6b9efe2f570e2876f67330bfddf8c1Erin Dahlgren                context.getResources().obtainTypedArray(panoIndicatorArrayId);
8371a742968e6b9efe2f570e2876f67330bfddf8c1Erin Dahlgren        }
84abf54e2994961395a0feb0b08353e62718443f23Spike Sprague
85abf54e2994961395a0feb0b08353e62718443f23Spike Sprague        mExposureIndicatorN2 = (ImageView) root.findViewById(R.id.exposure_n2_indicator);
86abf54e2994961395a0feb0b08353e62718443f23Spike Sprague        mExposureIndicatorN1 = (ImageView) root.findViewById(R.id.exposure_n1_indicator);
87abf54e2994961395a0feb0b08353e62718443f23Spike Sprague        mExposureIndicatorP1 = (ImageView) root.findViewById(R.id.exposure_p1_indicator);
88abf54e2994961395a0feb0b08353e62718443f23Spike Sprague        mExposureIndicatorP2 = (ImageView) root.findViewById(R.id.exposure_p2_indicator);
896e07fe22cf84e9eea02d368bf64ab68d92401f20Erin Dahlgren    }
906e07fe22cf84e9eea02d368bf64ab68d92401f20Erin Dahlgren
91e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren    @Override
92e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren    public void onButtonVisibilityChanged(ButtonManager buttonManager, int buttonId) {
93e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren        syncIndicatorWithButton(buttonId);
94e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren    }
95e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren
96e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren    @Override
97e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren    public void onButtonEnabledChanged(ButtonManager buttonManager, int buttonId) {
98e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren        syncIndicatorWithButton(buttonId);
99e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren    }
100e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren
101e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren    /**
102e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren     * Syncs a specific indicator's icon and visibility
103e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren     * based on the enabled state and visibility of a button.
104e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren     */
105e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren    private void syncIndicatorWithButton(int buttonId) {
106e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren        switch (buttonId) {
107a906809bd3e67f3ceaa070baefbdca8c9cb3d766Erin Dahlgren            case ButtonManager.BUTTON_FLASH: {
108a906809bd3e67f3ceaa070baefbdca8c9cb3d766Erin Dahlgren                syncFlashIndicator();
109a906809bd3e67f3ceaa070baefbdca8c9cb3d766Erin Dahlgren                break;
110e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren            }
111a906809bd3e67f3ceaa070baefbdca8c9cb3d766Erin Dahlgren            case ButtonManager.BUTTON_TORCH: {
112a906809bd3e67f3ceaa070baefbdca8c9cb3d766Erin Dahlgren                syncFlashIndicator();
113a906809bd3e67f3ceaa070baefbdca8c9cb3d766Erin Dahlgren                break;
114e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren            }
115a906809bd3e67f3ceaa070baefbdca8c9cb3d766Erin Dahlgren            case ButtonManager.BUTTON_HDRPLUS: {
116a906809bd3e67f3ceaa070baefbdca8c9cb3d766Erin Dahlgren                syncHdrIndicator();
117a906809bd3e67f3ceaa070baefbdca8c9cb3d766Erin Dahlgren                break;
118a906809bd3e67f3ceaa070baefbdca8c9cb3d766Erin Dahlgren            }
119e7d745c15f1ee0f3a160e7601715e70f9646e6c0Erin Dahlgren            case ButtonManager.BUTTON_HDR: {
120e7d745c15f1ee0f3a160e7601715e70f9646e6c0Erin Dahlgren                syncHdrIndicator();
121e7d745c15f1ee0f3a160e7601715e70f9646e6c0Erin Dahlgren                break;
122e7d745c15f1ee0f3a160e7601715e70f9646e6c0Erin Dahlgren            }
123abf54e2994961395a0feb0b08353e62718443f23Spike Sprague            case ButtonManager.BUTTON_EXPOSURE_COMPENSATION: {
124abf54e2994961395a0feb0b08353e62718443f23Spike Sprague                syncExposureIndicator();
125abf54e2994961395a0feb0b08353e62718443f23Spike Sprague                break;
126abf54e2994961395a0feb0b08353e62718443f23Spike Sprague            }
127a1fab413bcbe5f62ae1d829bac0539519fef96a6Erin Dahlgren            default:
128a1fab413bcbe5f62ae1d829bac0539519fef96a6Erin Dahlgren                // Do nothing.  The indicator doesn't care
129a1fab413bcbe5f62ae1d829bac0539519fef96a6Erin Dahlgren                // about button that don't correspond to indicators.
130e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren        }
131e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren    }
132e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren
133e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren    /**
134e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren     * Sets all indicators to the correct resource and visibility
135e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren     * based on the current settings.
136e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren     */
137a906809bd3e67f3ceaa070baefbdca8c9cb3d766Erin Dahlgren    public void syncIndicators() {
138a906809bd3e67f3ceaa070baefbdca8c9cb3d766Erin Dahlgren        syncFlashIndicator();
139a906809bd3e67f3ceaa070baefbdca8c9cb3d766Erin Dahlgren        syncHdrIndicator();
14071a742968e6b9efe2f570e2876f67330bfddf8c1Erin Dahlgren        syncPanoIndicator();
141abf54e2994961395a0feb0b08353e62718443f23Spike Sprague        syncExposureIndicator();
14271a742968e6b9efe2f570e2876f67330bfddf8c1Erin Dahlgren    }
14371a742968e6b9efe2f570e2876f67330bfddf8c1Erin Dahlgren
14471a742968e6b9efe2f570e2876f67330bfddf8c1Erin Dahlgren    /**
14571a742968e6b9efe2f570e2876f67330bfddf8c1Erin Dahlgren     * If the new visibility is different from the current visibility
14671a742968e6b9efe2f570e2876f67330bfddf8c1Erin Dahlgren     * on a view, change the visibility and call any registered
14771a742968e6b9efe2f570e2876f67330bfddf8c1Erin Dahlgren     * {@link OnIndicatorVisibilityChangedListener}.
14871a742968e6b9efe2f570e2876f67330bfddf8c1Erin Dahlgren     */
149abf54e2994961395a0feb0b08353e62718443f23Spike Sprague    private static void changeVisibility(View view, int visibility) {
15071a742968e6b9efe2f570e2876f67330bfddf8c1Erin Dahlgren        if (view.getVisibility() != visibility) {
15171a742968e6b9efe2f570e2876f67330bfddf8c1Erin Dahlgren            view.setVisibility(visibility);
15271a742968e6b9efe2f570e2876f67330bfddf8c1Erin Dahlgren        }
153e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren    }
154e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren
155e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren    /**
156e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren     * Sync the icon and visibility of the flash indicator.
157e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren     */
158a906809bd3e67f3ceaa070baefbdca8c9cb3d766Erin Dahlgren    private void syncFlashIndicator() {
159a906809bd3e67f3ceaa070baefbdca8c9cb3d766Erin Dahlgren        ButtonManager buttonManager = mController.getButtonManager();
160e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren        // If flash isn't an enabled and visible option,
161e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren        // do not show the indicator.
162e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren        if (buttonManager.isEnabled(ButtonManager.BUTTON_FLASH)
163e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren                && buttonManager.isVisible(ButtonManager.BUTTON_FLASH)) {
164e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren
165a906809bd3e67f3ceaa070baefbdca8c9cb3d766Erin Dahlgren            int modeIndex = mController.getCurrentModuleIndex();
166a906809bd3e67f3ceaa070baefbdca8c9cb3d766Erin Dahlgren            if (modeIndex == mController.getAndroidContext().getResources()
167bd1b8f910d6f2c94daac304f4bd1a098939474c3Doris Liu                    .getInteger(R.integer.camera_mode_video)) {
168a906809bd3e67f3ceaa070baefbdca8c9cb3d766Erin Dahlgren                setIndicatorState(mController.getSettingsManager(),
169e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren                                  SettingsManager.SETTING_VIDEOCAMERA_FLASH_MODE,
170a1fab413bcbe5f62ae1d829bac0539519fef96a6Erin Dahlgren                                  mFlashIndicator, mFlashIndicatorVideoIcons, false);
171e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren            } else {
172a906809bd3e67f3ceaa070baefbdca8c9cb3d766Erin Dahlgren                setIndicatorState(mController.getSettingsManager(),
173e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren                                  SettingsManager.SETTING_FLASH_MODE,
174a1fab413bcbe5f62ae1d829bac0539519fef96a6Erin Dahlgren                                  mFlashIndicator, mFlashIndicatorPhotoIcons, false);
175e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren            }
176e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren        } else {
17771a742968e6b9efe2f570e2876f67330bfddf8c1Erin Dahlgren            changeVisibility(mFlashIndicator, View.GONE);
178e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren        }
179e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren    }
180e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren
181e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren    /**
182e7d745c15f1ee0f3a160e7601715e70f9646e6c0Erin Dahlgren     * Sync the icon and the visibility of the hdr/hdrplus indicator.
183e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren     */
184a906809bd3e67f3ceaa070baefbdca8c9cb3d766Erin Dahlgren    private void syncHdrIndicator() {
185a906809bd3e67f3ceaa070baefbdca8c9cb3d766Erin Dahlgren        ButtonManager buttonManager = mController.getButtonManager();
186e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren        // If hdr isn't an enabled and visible option,
187e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren        // do not show the indicator.
188e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren        if (buttonManager.isEnabled(ButtonManager.BUTTON_HDRPLUS)
189e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren                && buttonManager.isVisible(ButtonManager.BUTTON_HDRPLUS)) {
190a906809bd3e67f3ceaa070baefbdca8c9cb3d766Erin Dahlgren            setIndicatorState(mController.getSettingsManager(),
1918ad8ad4841f65ee89e3c5e79f57d95cf8e4438b4Doris Liu                              SettingsManager.SETTING_CAMERA_HDR_PLUS,
192e7d745c15f1ee0f3a160e7601715e70f9646e6c0Erin Dahlgren                              mHdrIndicator, mHdrPlusIndicatorIcons, false);
193e7d745c15f1ee0f3a160e7601715e70f9646e6c0Erin Dahlgren        } else if (buttonManager.isEnabled(ButtonManager.BUTTON_HDR)
194e7d745c15f1ee0f3a160e7601715e70f9646e6c0Erin Dahlgren                && buttonManager.isVisible(ButtonManager.BUTTON_HDR)) {
195e7d745c15f1ee0f3a160e7601715e70f9646e6c0Erin Dahlgren            setIndicatorState(mController.getSettingsManager(),
196e7d745c15f1ee0f3a160e7601715e70f9646e6c0Erin Dahlgren                              SettingsManager.SETTING_CAMERA_HDR,
197a1fab413bcbe5f62ae1d829bac0539519fef96a6Erin Dahlgren                              mHdrIndicator, mHdrIndicatorIcons, false);
198e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren        } else {
19971a742968e6b9efe2f570e2876f67330bfddf8c1Erin Dahlgren            changeVisibility(mHdrIndicator, View.GONE);
20071a742968e6b9efe2f570e2876f67330bfddf8c1Erin Dahlgren        }
20171a742968e6b9efe2f570e2876f67330bfddf8c1Erin Dahlgren    }
20271a742968e6b9efe2f570e2876f67330bfddf8c1Erin Dahlgren
20371a742968e6b9efe2f570e2876f67330bfddf8c1Erin Dahlgren    /**
20471a742968e6b9efe2f570e2876f67330bfddf8c1Erin Dahlgren     * Sync the icon and the visibility of the pano indicator.
20571a742968e6b9efe2f570e2876f67330bfddf8c1Erin Dahlgren     */
20671a742968e6b9efe2f570e2876f67330bfddf8c1Erin Dahlgren    private void syncPanoIndicator() {
20771a742968e6b9efe2f570e2876f67330bfddf8c1Erin Dahlgren        if (mPanoIndicator == null) {
20871a742968e6b9efe2f570e2876f67330bfddf8c1Erin Dahlgren            Log.w(TAG, "Trying to sync a pano indicator that is not initialized.");
20971a742968e6b9efe2f570e2876f67330bfddf8c1Erin Dahlgren            return;
21071a742968e6b9efe2f570e2876f67330bfddf8c1Erin Dahlgren        }
21171a742968e6b9efe2f570e2876f67330bfddf8c1Erin Dahlgren
21271a742968e6b9efe2f570e2876f67330bfddf8c1Erin Dahlgren        ButtonManager buttonManager = mController.getButtonManager();
21359345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague        if (buttonManager.isPanoEnabled()) {
21471a742968e6b9efe2f570e2876f67330bfddf8c1Erin Dahlgren            setIndicatorState(mController.getSettingsManager(),
21571a742968e6b9efe2f570e2876f67330bfddf8c1Erin Dahlgren                              SettingsManager.SETTING_CAMERA_PANO_ORIENTATION,
21671a742968e6b9efe2f570e2876f67330bfddf8c1Erin Dahlgren                              mPanoIndicator, mPanoIndicatorIcons, true);
21771a742968e6b9efe2f570e2876f67330bfddf8c1Erin Dahlgren        } else {
21871a742968e6b9efe2f570e2876f67330bfddf8c1Erin Dahlgren            changeVisibility(mPanoIndicator, View.GONE);
219a1fab413bcbe5f62ae1d829bac0539519fef96a6Erin Dahlgren        }
220a1fab413bcbe5f62ae1d829bac0539519fef96a6Erin Dahlgren    }
221a1fab413bcbe5f62ae1d829bac0539519fef96a6Erin Dahlgren
222abf54e2994961395a0feb0b08353e62718443f23Spike Sprague    private void syncExposureIndicator() {
223abf54e2994961395a0feb0b08353e62718443f23Spike Sprague        if (mExposureIndicatorN2 == null
224abf54e2994961395a0feb0b08353e62718443f23Spike Sprague            || mExposureIndicatorN1 == null
225abf54e2994961395a0feb0b08353e62718443f23Spike Sprague            || mExposureIndicatorP1 == null
226abf54e2994961395a0feb0b08353e62718443f23Spike Sprague            || mExposureIndicatorP2 == null) {
227abf54e2994961395a0feb0b08353e62718443f23Spike Sprague            Log.w(TAG, "Trying to sync exposure indicators that are not initialized.");
228abf54e2994961395a0feb0b08353e62718443f23Spike Sprague            return;
229abf54e2994961395a0feb0b08353e62718443f23Spike Sprague        }
230abf54e2994961395a0feb0b08353e62718443f23Spike Sprague
231abf54e2994961395a0feb0b08353e62718443f23Spike Sprague
232abf54e2994961395a0feb0b08353e62718443f23Spike Sprague        // Reset all exposure indicator icons.
233abf54e2994961395a0feb0b08353e62718443f23Spike Sprague        changeVisibility(mExposureIndicatorN2, View.GONE);
234abf54e2994961395a0feb0b08353e62718443f23Spike Sprague        changeVisibility(mExposureIndicatorN1, View.GONE);
235abf54e2994961395a0feb0b08353e62718443f23Spike Sprague        changeVisibility(mExposureIndicatorP1, View.GONE);
236abf54e2994961395a0feb0b08353e62718443f23Spike Sprague        changeVisibility(mExposureIndicatorP2, View.GONE);
237abf54e2994961395a0feb0b08353e62718443f23Spike Sprague
238abf54e2994961395a0feb0b08353e62718443f23Spike Sprague        ButtonManager buttonManager = mController.getButtonManager();
239abf54e2994961395a0feb0b08353e62718443f23Spike Sprague        if (buttonManager.isEnabled(ButtonManager.BUTTON_EXPOSURE_COMPENSATION)
240abf54e2994961395a0feb0b08353e62718443f23Spike Sprague                && buttonManager.isVisible(ButtonManager.BUTTON_EXPOSURE_COMPENSATION)) {
241abf54e2994961395a0feb0b08353e62718443f23Spike Sprague
242abf54e2994961395a0feb0b08353e62718443f23Spike Sprague            String compString = mController.getSettingsManager().get(
243abf54e2994961395a0feb0b08353e62718443f23Spike Sprague                    SettingsManager.SETTING_EXPOSURE_COMPENSATION_VALUE);
244abf54e2994961395a0feb0b08353e62718443f23Spike Sprague            int comp = Integer.parseInt(compString);
245abf54e2994961395a0feb0b08353e62718443f23Spike Sprague            // Turn on the appropriate indicator.
246abf54e2994961395a0feb0b08353e62718443f23Spike Sprague            // Each integer compensation represent 1/6 of a stop.
247abf54e2994961395a0feb0b08353e62718443f23Spike Sprague            switch (comp / 6) {
248abf54e2994961395a0feb0b08353e62718443f23Spike Sprague                case -2:
249abf54e2994961395a0feb0b08353e62718443f23Spike Sprague                    changeVisibility(mExposureIndicatorN2, View.VISIBLE);
250abf54e2994961395a0feb0b08353e62718443f23Spike Sprague                    break;
251abf54e2994961395a0feb0b08353e62718443f23Spike Sprague                case -1:
252abf54e2994961395a0feb0b08353e62718443f23Spike Sprague                    changeVisibility(mExposureIndicatorN1, View.VISIBLE);
253abf54e2994961395a0feb0b08353e62718443f23Spike Sprague                    break;
254abf54e2994961395a0feb0b08353e62718443f23Spike Sprague                case 0:
255abf54e2994961395a0feb0b08353e62718443f23Spike Sprague                    // Do nothing.
256abf54e2994961395a0feb0b08353e62718443f23Spike Sprague                    break;
257abf54e2994961395a0feb0b08353e62718443f23Spike Sprague                case 1:
258abf54e2994961395a0feb0b08353e62718443f23Spike Sprague                    changeVisibility(mExposureIndicatorP1, View.VISIBLE);
259abf54e2994961395a0feb0b08353e62718443f23Spike Sprague                    break;
260abf54e2994961395a0feb0b08353e62718443f23Spike Sprague                case 2:
261abf54e2994961395a0feb0b08353e62718443f23Spike Sprague                    changeVisibility(mExposureIndicatorP2, View.VISIBLE);
262abf54e2994961395a0feb0b08353e62718443f23Spike Sprague            }
263abf54e2994961395a0feb0b08353e62718443f23Spike Sprague        }
264abf54e2994961395a0feb0b08353e62718443f23Spike Sprague    }
265abf54e2994961395a0feb0b08353e62718443f23Spike Sprague
266a1fab413bcbe5f62ae1d829bac0539519fef96a6Erin Dahlgren    /**
267e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren     * Sets the image resource and visibility of the indicator
268e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren     * based on the indicator's corresponding setting state.
269e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren     */
270e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren    private void setIndicatorState(SettingsManager settingsManager, int id,
271a1fab413bcbe5f62ae1d829bac0539519fef96a6Erin Dahlgren            ImageView imageView, TypedArray iconArray, boolean showDefault) {
272e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren
273e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren        // Set the correct image src.
274e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren        String value = settingsManager.get(id);
275e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren        int valueIndex = settingsManager.getStringValueIndex(id);
276e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren        if (valueIndex < 0) {
277e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren            // This can happen when the setting is camera dependent
278e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren            // and the camera is not yet open.  CameraAppUI.onChangeCamera()
279e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren            // will call this again when the camera is open.
280e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren            Log.w(TAG, "The setting for this indicator is not available.");
281e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren            imageView.setVisibility(View.GONE);
282e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren            return;
283e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren        }
284e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren        Drawable drawable = iconArray.getDrawable(valueIndex);
285e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren        if (drawable == null) {
286e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren            throw new IllegalStateException("Indicator drawable is null.");
287e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren        }
288e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren        imageView.setImageDrawable(drawable);
289e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren
290e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren        // Set the indicator visible if not in default state.
2916e07fe22cf84e9eea02d368bf64ab68d92401f20Erin Dahlgren        boolean visibilityChanged = false;
292a1fab413bcbe5f62ae1d829bac0539519fef96a6Erin Dahlgren        if (!showDefault && settingsManager.isDefault(id)) {
29371a742968e6b9efe2f570e2876f67330bfddf8c1Erin Dahlgren            changeVisibility(imageView, View.GONE);
294e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren        } else {
29571a742968e6b9efe2f570e2876f67330bfddf8c1Erin Dahlgren            changeVisibility(imageView, View.VISIBLE);
296e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren        }
297e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren    }
298e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren
299e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren    @Override
300e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren    public void onSettingChanged(SettingsManager settingsManager, int id) {
301e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren        switch (id) {
302e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren            case SettingsManager.SETTING_FLASH_MODE: {
303a1fab413bcbe5f62ae1d829bac0539519fef96a6Erin Dahlgren                syncFlashIndicator();
304e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren                break;
305e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren            }
306e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren            case SettingsManager.SETTING_VIDEOCAMERA_FLASH_MODE: {
307a1fab413bcbe5f62ae1d829bac0539519fef96a6Erin Dahlgren                syncFlashIndicator();
308e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren                break;
309e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren            }
3108ad8ad4841f65ee89e3c5e79f57d95cf8e4438b4Doris Liu            case SettingsManager.SETTING_CAMERA_HDR_PLUS: {
3118ad8ad4841f65ee89e3c5e79f57d95cf8e4438b4Doris Liu                syncHdrIndicator();
3128ad8ad4841f65ee89e3c5e79f57d95cf8e4438b4Doris Liu                break;
3138ad8ad4841f65ee89e3c5e79f57d95cf8e4438b4Doris Liu            }
314e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren            case SettingsManager.SETTING_CAMERA_HDR: {
315a1fab413bcbe5f62ae1d829bac0539519fef96a6Erin Dahlgren                syncHdrIndicator();
316a1fab413bcbe5f62ae1d829bac0539519fef96a6Erin Dahlgren                break;
317a1fab413bcbe5f62ae1d829bac0539519fef96a6Erin Dahlgren            }
31871a742968e6b9efe2f570e2876f67330bfddf8c1Erin Dahlgren            case SettingsManager.SETTING_CAMERA_PANO_ORIENTATION: {
31971a742968e6b9efe2f570e2876f67330bfddf8c1Erin Dahlgren                syncPanoIndicator();
32071a742968e6b9efe2f570e2876f67330bfddf8c1Erin Dahlgren                break;
32171a742968e6b9efe2f570e2876f67330bfddf8c1Erin Dahlgren            }
322abf54e2994961395a0feb0b08353e62718443f23Spike Sprague            case SettingsManager.SETTING_EXPOSURE_COMPENSATION_ENABLED:
323abf54e2994961395a0feb0b08353e62718443f23Spike Sprague                // Fall through to the next case.
324abf54e2994961395a0feb0b08353e62718443f23Spike Sprague            case SettingsManager.SETTING_EXPOSURE_COMPENSATION_VALUE: {
325abf54e2994961395a0feb0b08353e62718443f23Spike Sprague                syncExposureIndicator();
326abf54e2994961395a0feb0b08353e62718443f23Spike Sprague                break;
327abf54e2994961395a0feb0b08353e62718443f23Spike Sprague            }
328e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren            default: {
329e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren                // Do nothing.
330e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren            }
331e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren        }
332e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren    }
333e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren}
334