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;
286190c36db653e848f29d1caefc4fa1bb61e8a662Erin Dahlgrenimport com.android.camera.settings.Keys;
29e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgrenimport com.android.camera.settings.SettingsManager;
30d706ea69a87229dca5cb8f16125decfbcbc5303dErin Dahlgrenimport com.android.camera.util.PhotoSphereHelper;
31e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgrenimport com.android.camera2.R;
32e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren
33e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren/**
34e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren * IndicatorIconController sets the visibility and icon state of
35e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren * on screen indicators.
36e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren *
37e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren * Indicators are only visible if they are in a non-default state.  The
38e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren * visibility of an indicator is set when an indicator's setting changes.
39e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren */
40e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgrenpublic class IndicatorIconController
41e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren    implements SettingsManager.OnSettingChangedListener,
42e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren               ButtonManager.ButtonStatusListener {
43e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren
445596b4c902dcb685928b43678f428746ca5ffd08Angus Kong    private final static Log.Tag TAG = new Log.Tag("IndicatorIconCtrlr");
45e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren
46e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren    private ImageView mFlashIndicator;
47e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren    private ImageView mHdrIndicator;
4871a742968e6b9efe2f570e2876f67330bfddf8c1Erin Dahlgren    private ImageView mPanoIndicator;
496c75164c89f3bbd4f894b9c49a7914a24268a999Doris Liu    private ImageView mCountdownTimerIndicator;
50e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren
51abf54e2994961395a0feb0b08353e62718443f23Spike Sprague    private ImageView mExposureIndicatorN2;
52abf54e2994961395a0feb0b08353e62718443f23Spike Sprague    private ImageView mExposureIndicatorN1;
53abf54e2994961395a0feb0b08353e62718443f23Spike Sprague    private ImageView mExposureIndicatorP1;
54abf54e2994961395a0feb0b08353e62718443f23Spike Sprague    private ImageView mExposureIndicatorP2;
55abf54e2994961395a0feb0b08353e62718443f23Spike Sprague
56e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren    private TypedArray mFlashIndicatorPhotoIcons;
57e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren    private TypedArray mFlashIndicatorVideoIcons;
58e7d745c15f1ee0f3a160e7601715e70f9646e6c0Erin Dahlgren    private TypedArray mHdrPlusIndicatorIcons;
59e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren    private TypedArray mHdrIndicatorIcons;
6071a742968e6b9efe2f570e2876f67330bfddf8c1Erin Dahlgren    private TypedArray mPanoIndicatorIcons;
616c75164c89f3bbd4f894b9c49a7914a24268a999Doris Liu    private TypedArray mCountdownTimerIndicatorIcons;
626e07fe22cf84e9eea02d368bf64ab68d92401f20Erin Dahlgren
63e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren    private AppController mController;
64e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren
65e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren    public IndicatorIconController(AppController controller, View root) {
66e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren        mController = controller;
67e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren        Context context = controller.getAndroidContext();
68e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren
69e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren        mFlashIndicator = (ImageView) root.findViewById(R.id.flash_indicator);
70e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren        mFlashIndicatorPhotoIcons = context.getResources().obtainTypedArray(
71e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren            R.array.camera_flashmode_indicator_icons);
72e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren        mFlashIndicatorVideoIcons = context.getResources().obtainTypedArray(
73e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren            R.array.video_flashmode_indicator_icons);
7471a742968e6b9efe2f570e2876f67330bfddf8c1Erin Dahlgren
7571a742968e6b9efe2f570e2876f67330bfddf8c1Erin Dahlgren        mHdrIndicator = (ImageView) root.findViewById(R.id.hdr_indicator);
76e7d745c15f1ee0f3a160e7601715e70f9646e6c0Erin Dahlgren        mHdrPlusIndicatorIcons = context.getResources().obtainTypedArray(
77e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren            R.array.pref_camera_hdr_plus_indicator_icons);
78e7d745c15f1ee0f3a160e7601715e70f9646e6c0Erin Dahlgren        mHdrIndicatorIcons = context.getResources().obtainTypedArray(
79e7d745c15f1ee0f3a160e7601715e70f9646e6c0Erin Dahlgren            R.array.pref_camera_hdr_indicator_icons);
8071a742968e6b9efe2f570e2876f67330bfddf8c1Erin Dahlgren
8171a742968e6b9efe2f570e2876f67330bfddf8c1Erin Dahlgren        int panoIndicatorArrayId = PhotoSphereHelper.getPanoramaOrientationIndicatorArrayId();
8271a742968e6b9efe2f570e2876f67330bfddf8c1Erin Dahlgren        if (panoIndicatorArrayId > 0) {
8371a742968e6b9efe2f570e2876f67330bfddf8c1Erin Dahlgren            mPanoIndicator = (ImageView) root.findViewById(R.id.pano_indicator);
8471a742968e6b9efe2f570e2876f67330bfddf8c1Erin Dahlgren            mPanoIndicatorIcons =
8571a742968e6b9efe2f570e2876f67330bfddf8c1Erin Dahlgren                context.getResources().obtainTypedArray(panoIndicatorArrayId);
8671a742968e6b9efe2f570e2876f67330bfddf8c1Erin Dahlgren        }
87abf54e2994961395a0feb0b08353e62718443f23Spike Sprague
886c75164c89f3bbd4f894b9c49a7914a24268a999Doris Liu        mCountdownTimerIndicator = (ImageView) root.findViewById(R.id.countdown_timer_indicator);
896c75164c89f3bbd4f894b9c49a7914a24268a999Doris Liu        mCountdownTimerIndicatorIcons = context.getResources().obtainTypedArray(
906c75164c89f3bbd4f894b9c49a7914a24268a999Doris Liu                R.array.pref_camera_countdown_indicators);
916c75164c89f3bbd4f894b9c49a7914a24268a999Doris Liu
92abf54e2994961395a0feb0b08353e62718443f23Spike Sprague        mExposureIndicatorN2 = (ImageView) root.findViewById(R.id.exposure_n2_indicator);
93abf54e2994961395a0feb0b08353e62718443f23Spike Sprague        mExposureIndicatorN1 = (ImageView) root.findViewById(R.id.exposure_n1_indicator);
94abf54e2994961395a0feb0b08353e62718443f23Spike Sprague        mExposureIndicatorP1 = (ImageView) root.findViewById(R.id.exposure_p1_indicator);
95abf54e2994961395a0feb0b08353e62718443f23Spike Sprague        mExposureIndicatorP2 = (ImageView) root.findViewById(R.id.exposure_p2_indicator);
966e07fe22cf84e9eea02d368bf64ab68d92401f20Erin Dahlgren    }
976e07fe22cf84e9eea02d368bf64ab68d92401f20Erin Dahlgren
98e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren    @Override
99e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren    public void onButtonVisibilityChanged(ButtonManager buttonManager, int buttonId) {
100e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren        syncIndicatorWithButton(buttonId);
101e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren    }
102e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren
103e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren    @Override
104e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren    public void onButtonEnabledChanged(ButtonManager buttonManager, int buttonId) {
105e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren        syncIndicatorWithButton(buttonId);
106e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren    }
107e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren
108e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren    /**
109e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren     * Syncs a specific indicator's icon and visibility
110e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren     * based on the enabled state and visibility of a button.
111e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren     */
112e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren    private void syncIndicatorWithButton(int buttonId) {
113e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren        switch (buttonId) {
114a906809bd3e67f3ceaa070baefbdca8c9cb3d766Erin Dahlgren            case ButtonManager.BUTTON_FLASH: {
115a906809bd3e67f3ceaa070baefbdca8c9cb3d766Erin Dahlgren                syncFlashIndicator();
116a906809bd3e67f3ceaa070baefbdca8c9cb3d766Erin Dahlgren                break;
117e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren            }
118a906809bd3e67f3ceaa070baefbdca8c9cb3d766Erin Dahlgren            case ButtonManager.BUTTON_TORCH: {
119a906809bd3e67f3ceaa070baefbdca8c9cb3d766Erin Dahlgren                syncFlashIndicator();
120a906809bd3e67f3ceaa070baefbdca8c9cb3d766Erin Dahlgren                break;
121e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren            }
12215473d4b69f4ad619aa10430e4bc86ab4fa815d0Erin Dahlgren            case ButtonManager.BUTTON_HDR_PLUS: {
123a906809bd3e67f3ceaa070baefbdca8c9cb3d766Erin Dahlgren                syncHdrIndicator();
124a906809bd3e67f3ceaa070baefbdca8c9cb3d766Erin Dahlgren                break;
125a906809bd3e67f3ceaa070baefbdca8c9cb3d766Erin Dahlgren            }
126e7d745c15f1ee0f3a160e7601715e70f9646e6c0Erin Dahlgren            case ButtonManager.BUTTON_HDR: {
127e7d745c15f1ee0f3a160e7601715e70f9646e6c0Erin Dahlgren                syncHdrIndicator();
128e7d745c15f1ee0f3a160e7601715e70f9646e6c0Erin Dahlgren                break;
129e7d745c15f1ee0f3a160e7601715e70f9646e6c0Erin Dahlgren            }
130abf54e2994961395a0feb0b08353e62718443f23Spike Sprague            case ButtonManager.BUTTON_EXPOSURE_COMPENSATION: {
131abf54e2994961395a0feb0b08353e62718443f23Spike Sprague                syncExposureIndicator();
132abf54e2994961395a0feb0b08353e62718443f23Spike Sprague                break;
133abf54e2994961395a0feb0b08353e62718443f23Spike Sprague            }
134a1fab413bcbe5f62ae1d829bac0539519fef96a6Erin Dahlgren            default:
135a1fab413bcbe5f62ae1d829bac0539519fef96a6Erin Dahlgren                // Do nothing.  The indicator doesn't care
136a1fab413bcbe5f62ae1d829bac0539519fef96a6Erin Dahlgren                // about button that don't correspond to indicators.
137e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren        }
138e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren    }
139e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren
140e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren    /**
141e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren     * Sets all indicators to the correct resource and visibility
142e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren     * based on the current settings.
143e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren     */
144a906809bd3e67f3ceaa070baefbdca8c9cb3d766Erin Dahlgren    public void syncIndicators() {
145a906809bd3e67f3ceaa070baefbdca8c9cb3d766Erin Dahlgren        syncFlashIndicator();
146a906809bd3e67f3ceaa070baefbdca8c9cb3d766Erin Dahlgren        syncHdrIndicator();
14771a742968e6b9efe2f570e2876f67330bfddf8c1Erin Dahlgren        syncPanoIndicator();
148abf54e2994961395a0feb0b08353e62718443f23Spike Sprague        syncExposureIndicator();
1496c75164c89f3bbd4f894b9c49a7914a24268a999Doris Liu        syncCountdownTimerIndicator();
15071a742968e6b9efe2f570e2876f67330bfddf8c1Erin Dahlgren    }
15171a742968e6b9efe2f570e2876f67330bfddf8c1Erin Dahlgren
15271a742968e6b9efe2f570e2876f67330bfddf8c1Erin Dahlgren    /**
15371a742968e6b9efe2f570e2876f67330bfddf8c1Erin Dahlgren     * If the new visibility is different from the current visibility
15471a742968e6b9efe2f570e2876f67330bfddf8c1Erin Dahlgren     * on a view, change the visibility and call any registered
15571a742968e6b9efe2f570e2876f67330bfddf8c1Erin Dahlgren     * {@link OnIndicatorVisibilityChangedListener}.
15671a742968e6b9efe2f570e2876f67330bfddf8c1Erin Dahlgren     */
157abf54e2994961395a0feb0b08353e62718443f23Spike Sprague    private static void changeVisibility(View view, int visibility) {
15871a742968e6b9efe2f570e2876f67330bfddf8c1Erin Dahlgren        if (view.getVisibility() != visibility) {
15971a742968e6b9efe2f570e2876f67330bfddf8c1Erin Dahlgren            view.setVisibility(visibility);
16071a742968e6b9efe2f570e2876f67330bfddf8c1Erin Dahlgren        }
161e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren    }
162e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren
163e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren    /**
164e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren     * Sync the icon and visibility of the flash indicator.
165e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren     */
166a906809bd3e67f3ceaa070baefbdca8c9cb3d766Erin Dahlgren    private void syncFlashIndicator() {
167a906809bd3e67f3ceaa070baefbdca8c9cb3d766Erin Dahlgren        ButtonManager buttonManager = mController.getButtonManager();
168e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren        // If flash isn't an enabled and visible option,
169e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren        // do not show the indicator.
170030ea25812565f3e35d3e76942eaa79a751ff006Spike Sprague        if ((buttonManager.isEnabled(ButtonManager.BUTTON_FLASH)
171030ea25812565f3e35d3e76942eaa79a751ff006Spike Sprague                && buttonManager.isVisible(ButtonManager.BUTTON_FLASH))
172030ea25812565f3e35d3e76942eaa79a751ff006Spike Sprague                || (buttonManager.isEnabled(ButtonManager.BUTTON_TORCH)
173030ea25812565f3e35d3e76942eaa79a751ff006Spike Sprague                && buttonManager.isVisible(ButtonManager.BUTTON_TORCH))) {
174e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren
175a906809bd3e67f3ceaa070baefbdca8c9cb3d766Erin Dahlgren            int modeIndex = mController.getCurrentModuleIndex();
176a906809bd3e67f3ceaa070baefbdca8c9cb3d766Erin Dahlgren            if (modeIndex == mController.getAndroidContext().getResources()
177bd1b8f910d6f2c94daac304f4bd1a098939474c3Doris Liu                    .getInteger(R.integer.camera_mode_video)) {
1786190c36db653e848f29d1caefc4fa1bb61e8a662Erin Dahlgren                setIndicatorState(mController.getCameraScope(),
1796190c36db653e848f29d1caefc4fa1bb61e8a662Erin Dahlgren                                  Keys.KEY_VIDEOCAMERA_FLASH_MODE, mFlashIndicator,
1806190c36db653e848f29d1caefc4fa1bb61e8a662Erin Dahlgren                                  mFlashIndicatorVideoIcons, false);
18115473d4b69f4ad619aa10430e4bc86ab4fa815d0Erin Dahlgren            } else if (modeIndex == mController.getAndroidContext().getResources()
18215473d4b69f4ad619aa10430e4bc86ab4fa815d0Erin Dahlgren                    .getInteger(R.integer.camera_mode_gcam)) {
1836190c36db653e848f29d1caefc4fa1bb61e8a662Erin Dahlgren                setIndicatorState(mController.getCameraScope(),
1846190c36db653e848f29d1caefc4fa1bb61e8a662Erin Dahlgren                                  Keys.KEY_HDR_PLUS_FLASH_MODE, mFlashIndicator,
1856190c36db653e848f29d1caefc4fa1bb61e8a662Erin Dahlgren                                  mFlashIndicatorPhotoIcons, false);
186e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren            } else {
1876190c36db653e848f29d1caefc4fa1bb61e8a662Erin Dahlgren                setIndicatorState(mController.getCameraScope(),
1886190c36db653e848f29d1caefc4fa1bb61e8a662Erin Dahlgren                                  Keys.KEY_FLASH_MODE, mFlashIndicator,
1896190c36db653e848f29d1caefc4fa1bb61e8a662Erin Dahlgren                                  mFlashIndicatorPhotoIcons, false);
190e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren            }
191e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren        } else {
19271a742968e6b9efe2f570e2876f67330bfddf8c1Erin Dahlgren            changeVisibility(mFlashIndicator, View.GONE);
193e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren        }
194e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren    }
195e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren
196e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren    /**
197e7d745c15f1ee0f3a160e7601715e70f9646e6c0Erin Dahlgren     * Sync the icon and the visibility of the hdr/hdrplus indicator.
198e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren     */
199a906809bd3e67f3ceaa070baefbdca8c9cb3d766Erin Dahlgren    private void syncHdrIndicator() {
200a906809bd3e67f3ceaa070baefbdca8c9cb3d766Erin Dahlgren        ButtonManager buttonManager = mController.getButtonManager();
201e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren        // If hdr isn't an enabled and visible option,
202e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren        // do not show the indicator.
20315473d4b69f4ad619aa10430e4bc86ab4fa815d0Erin Dahlgren        if (buttonManager.isEnabled(ButtonManager.BUTTON_HDR_PLUS)
20415473d4b69f4ad619aa10430e4bc86ab4fa815d0Erin Dahlgren                && buttonManager.isVisible(ButtonManager.BUTTON_HDR_PLUS)) {
2056190c36db653e848f29d1caefc4fa1bb61e8a662Erin Dahlgren            setIndicatorState(SettingsManager.SCOPE_GLOBAL,
2066190c36db653e848f29d1caefc4fa1bb61e8a662Erin Dahlgren                              Keys.KEY_CAMERA_HDR_PLUS, mHdrIndicator,
2076190c36db653e848f29d1caefc4fa1bb61e8a662Erin Dahlgren                              mHdrPlusIndicatorIcons, false);
208e7d745c15f1ee0f3a160e7601715e70f9646e6c0Erin Dahlgren        } else if (buttonManager.isEnabled(ButtonManager.BUTTON_HDR)
209e7d745c15f1ee0f3a160e7601715e70f9646e6c0Erin Dahlgren                && buttonManager.isVisible(ButtonManager.BUTTON_HDR)) {
2106190c36db653e848f29d1caefc4fa1bb61e8a662Erin Dahlgren            setIndicatorState(SettingsManager.SCOPE_GLOBAL,
2114032a773c4605894a2b6137590c7124ea16b7ab2Alan Newberger                              Keys.KEY_CAMERA_HDR, mHdrIndicator,
2126190c36db653e848f29d1caefc4fa1bb61e8a662Erin Dahlgren                              mHdrIndicatorIcons, false);
213e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren        } else {
21471a742968e6b9efe2f570e2876f67330bfddf8c1Erin Dahlgren            changeVisibility(mHdrIndicator, View.GONE);
21571a742968e6b9efe2f570e2876f67330bfddf8c1Erin Dahlgren        }
21671a742968e6b9efe2f570e2876f67330bfddf8c1Erin Dahlgren    }
21771a742968e6b9efe2f570e2876f67330bfddf8c1Erin Dahlgren
21871a742968e6b9efe2f570e2876f67330bfddf8c1Erin Dahlgren    /**
21971a742968e6b9efe2f570e2876f67330bfddf8c1Erin Dahlgren     * Sync the icon and the visibility of the pano indicator.
22071a742968e6b9efe2f570e2876f67330bfddf8c1Erin Dahlgren     */
22171a742968e6b9efe2f570e2876f67330bfddf8c1Erin Dahlgren    private void syncPanoIndicator() {
22271a742968e6b9efe2f570e2876f67330bfddf8c1Erin Dahlgren        if (mPanoIndicator == null) {
22371a742968e6b9efe2f570e2876f67330bfddf8c1Erin Dahlgren            Log.w(TAG, "Trying to sync a pano indicator that is not initialized.");
22471a742968e6b9efe2f570e2876f67330bfddf8c1Erin Dahlgren            return;
22571a742968e6b9efe2f570e2876f67330bfddf8c1Erin Dahlgren        }
22671a742968e6b9efe2f570e2876f67330bfddf8c1Erin Dahlgren
22771a742968e6b9efe2f570e2876f67330bfddf8c1Erin Dahlgren        ButtonManager buttonManager = mController.getButtonManager();
22859345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague        if (buttonManager.isPanoEnabled()) {
2296190c36db653e848f29d1caefc4fa1bb61e8a662Erin Dahlgren            setIndicatorState(SettingsManager.SCOPE_GLOBAL,
2305c9d7f34039ac96b3a136ccd6b16162e3b220848Alan Newberger                              Keys.KEY_CAMERA_PANO_ORIENTATION, mPanoIndicator,
2316190c36db653e848f29d1caefc4fa1bb61e8a662Erin Dahlgren                              mPanoIndicatorIcons, true);
23271a742968e6b9efe2f570e2876f67330bfddf8c1Erin Dahlgren        } else {
23371a742968e6b9efe2f570e2876f67330bfddf8c1Erin Dahlgren            changeVisibility(mPanoIndicator, View.GONE);
234a1fab413bcbe5f62ae1d829bac0539519fef96a6Erin Dahlgren        }
235a1fab413bcbe5f62ae1d829bac0539519fef96a6Erin Dahlgren    }
236a1fab413bcbe5f62ae1d829bac0539519fef96a6Erin Dahlgren
237abf54e2994961395a0feb0b08353e62718443f23Spike Sprague    private void syncExposureIndicator() {
238abf54e2994961395a0feb0b08353e62718443f23Spike Sprague        if (mExposureIndicatorN2 == null
239abf54e2994961395a0feb0b08353e62718443f23Spike Sprague            || mExposureIndicatorN1 == null
240abf54e2994961395a0feb0b08353e62718443f23Spike Sprague            || mExposureIndicatorP1 == null
241abf54e2994961395a0feb0b08353e62718443f23Spike Sprague            || mExposureIndicatorP2 == null) {
242abf54e2994961395a0feb0b08353e62718443f23Spike Sprague            Log.w(TAG, "Trying to sync exposure indicators that are not initialized.");
243abf54e2994961395a0feb0b08353e62718443f23Spike Sprague            return;
244abf54e2994961395a0feb0b08353e62718443f23Spike Sprague        }
245abf54e2994961395a0feb0b08353e62718443f23Spike Sprague
246abf54e2994961395a0feb0b08353e62718443f23Spike Sprague
247abf54e2994961395a0feb0b08353e62718443f23Spike Sprague        // Reset all exposure indicator icons.
248abf54e2994961395a0feb0b08353e62718443f23Spike Sprague        changeVisibility(mExposureIndicatorN2, View.GONE);
249abf54e2994961395a0feb0b08353e62718443f23Spike Sprague        changeVisibility(mExposureIndicatorN1, View.GONE);
250abf54e2994961395a0feb0b08353e62718443f23Spike Sprague        changeVisibility(mExposureIndicatorP1, View.GONE);
251abf54e2994961395a0feb0b08353e62718443f23Spike Sprague        changeVisibility(mExposureIndicatorP2, View.GONE);
252abf54e2994961395a0feb0b08353e62718443f23Spike Sprague
253abf54e2994961395a0feb0b08353e62718443f23Spike Sprague        ButtonManager buttonManager = mController.getButtonManager();
254abf54e2994961395a0feb0b08353e62718443f23Spike Sprague        if (buttonManager.isEnabled(ButtonManager.BUTTON_EXPOSURE_COMPENSATION)
255abf54e2994961395a0feb0b08353e62718443f23Spike Sprague                && buttonManager.isVisible(ButtonManager.BUTTON_EXPOSURE_COMPENSATION)) {
256abf54e2994961395a0feb0b08353e62718443f23Spike Sprague
2572ef0f9dc95527a354846940bae675741c464e6aeAlan Newberger            int compValue = mController.getSettingsManager().getInteger(
2582ef0f9dc95527a354846940bae675741c464e6aeAlan Newberger                    mController.getCameraScope(), Keys.KEY_EXPOSURE);
2592ef0f9dc95527a354846940bae675741c464e6aeAlan Newberger            int comp = Math.round(compValue * buttonManager.getExposureCompensationStep());
260156f3e5b41cd2049230b1423c455763d31738693Spike Sprague
261abf54e2994961395a0feb0b08353e62718443f23Spike Sprague            // Turn on the appropriate indicator.
262156f3e5b41cd2049230b1423c455763d31738693Spike Sprague            switch (comp) {
263abf54e2994961395a0feb0b08353e62718443f23Spike Sprague                case -2:
264abf54e2994961395a0feb0b08353e62718443f23Spike Sprague                    changeVisibility(mExposureIndicatorN2, View.VISIBLE);
265abf54e2994961395a0feb0b08353e62718443f23Spike Sprague                    break;
266abf54e2994961395a0feb0b08353e62718443f23Spike Sprague                case -1:
267abf54e2994961395a0feb0b08353e62718443f23Spike Sprague                    changeVisibility(mExposureIndicatorN1, View.VISIBLE);
268abf54e2994961395a0feb0b08353e62718443f23Spike Sprague                    break;
269abf54e2994961395a0feb0b08353e62718443f23Spike Sprague                case 0:
270abf54e2994961395a0feb0b08353e62718443f23Spike Sprague                    // Do nothing.
271abf54e2994961395a0feb0b08353e62718443f23Spike Sprague                    break;
272abf54e2994961395a0feb0b08353e62718443f23Spike Sprague                case 1:
273abf54e2994961395a0feb0b08353e62718443f23Spike Sprague                    changeVisibility(mExposureIndicatorP1, View.VISIBLE);
274abf54e2994961395a0feb0b08353e62718443f23Spike Sprague                    break;
275abf54e2994961395a0feb0b08353e62718443f23Spike Sprague                case 2:
276abf54e2994961395a0feb0b08353e62718443f23Spike Sprague                    changeVisibility(mExposureIndicatorP2, View.VISIBLE);
277abf54e2994961395a0feb0b08353e62718443f23Spike Sprague            }
278abf54e2994961395a0feb0b08353e62718443f23Spike Sprague        }
279abf54e2994961395a0feb0b08353e62718443f23Spike Sprague    }
280abf54e2994961395a0feb0b08353e62718443f23Spike Sprague
2816c75164c89f3bbd4f894b9c49a7914a24268a999Doris Liu    private void syncCountdownTimerIndicator() {
2826c75164c89f3bbd4f894b9c49a7914a24268a999Doris Liu        ButtonManager buttonManager = mController.getButtonManager();
2836c75164c89f3bbd4f894b9c49a7914a24268a999Doris Liu
2846c75164c89f3bbd4f894b9c49a7914a24268a999Doris Liu        if (buttonManager.isEnabled(ButtonManager.BUTTON_COUNTDOWN)
2856190c36db653e848f29d1caefc4fa1bb61e8a662Erin Dahlgren            && buttonManager.isVisible(ButtonManager.BUTTON_COUNTDOWN)) {
2866190c36db653e848f29d1caefc4fa1bb61e8a662Erin Dahlgren            setIndicatorState(SettingsManager.SCOPE_GLOBAL,
2876190c36db653e848f29d1caefc4fa1bb61e8a662Erin Dahlgren                              Keys.KEY_COUNTDOWN_DURATION, mCountdownTimerIndicator,
2886190c36db653e848f29d1caefc4fa1bb61e8a662Erin Dahlgren                              mCountdownTimerIndicatorIcons, false);
2896c75164c89f3bbd4f894b9c49a7914a24268a999Doris Liu        } else {
2906c75164c89f3bbd4f894b9c49a7914a24268a999Doris Liu            changeVisibility(mCountdownTimerIndicator, View.GONE);
2916c75164c89f3bbd4f894b9c49a7914a24268a999Doris Liu        }
2926c75164c89f3bbd4f894b9c49a7914a24268a999Doris Liu    }
2936c75164c89f3bbd4f894b9c49a7914a24268a999Doris Liu
294a1fab413bcbe5f62ae1d829bac0539519fef96a6Erin Dahlgren    /**
295e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren     * Sets the image resource and visibility of the indicator
296e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren     * based on the indicator's corresponding setting state.
297e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren     */
2986190c36db653e848f29d1caefc4fa1bb61e8a662Erin Dahlgren    private void setIndicatorState(String scope, String key, ImageView imageView,
2996190c36db653e848f29d1caefc4fa1bb61e8a662Erin Dahlgren                                   TypedArray iconArray, boolean showDefault) {
3006190c36db653e848f29d1caefc4fa1bb61e8a662Erin Dahlgren        SettingsManager settingsManager = mController.getSettingsManager();
301e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren
3026190c36db653e848f29d1caefc4fa1bb61e8a662Erin Dahlgren        int valueIndex = settingsManager.getIndexOfCurrentValue(scope, key);
303e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren        if (valueIndex < 0) {
304e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren            // This can happen when the setting is camera dependent
305e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren            // and the camera is not yet open.  CameraAppUI.onChangeCamera()
306e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren            // will call this again when the camera is open.
307e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren            Log.w(TAG, "The setting for this indicator is not available.");
308e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren            imageView.setVisibility(View.GONE);
309e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren            return;
310e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren        }
311e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren        Drawable drawable = iconArray.getDrawable(valueIndex);
312e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren        if (drawable == null) {
313e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren            throw new IllegalStateException("Indicator drawable is null.");
314e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren        }
315e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren        imageView.setImageDrawable(drawable);
316e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren
317e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren        // Set the indicator visible if not in default state.
3186e07fe22cf84e9eea02d368bf64ab68d92401f20Erin Dahlgren        boolean visibilityChanged = false;
3196190c36db653e848f29d1caefc4fa1bb61e8a662Erin Dahlgren        if (!showDefault && settingsManager.isDefault(scope, key)) {
32071a742968e6b9efe2f570e2876f67330bfddf8c1Erin Dahlgren            changeVisibility(imageView, View.GONE);
321e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren        } else {
32271a742968e6b9efe2f570e2876f67330bfddf8c1Erin Dahlgren            changeVisibility(imageView, View.VISIBLE);
323e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren        }
324e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren    }
325e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren
326e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren    @Override
3276190c36db653e848f29d1caefc4fa1bb61e8a662Erin Dahlgren    public void onSettingChanged(SettingsManager settingsManager, String key) {
3286190c36db653e848f29d1caefc4fa1bb61e8a662Erin Dahlgren        if (key.equals(Keys.KEY_FLASH_MODE)) {
3296190c36db653e848f29d1caefc4fa1bb61e8a662Erin Dahlgren            syncFlashIndicator();
3306190c36db653e848f29d1caefc4fa1bb61e8a662Erin Dahlgren            return;
3316190c36db653e848f29d1caefc4fa1bb61e8a662Erin Dahlgren        }
3326190c36db653e848f29d1caefc4fa1bb61e8a662Erin Dahlgren        if (key.equals(Keys.KEY_VIDEOCAMERA_FLASH_MODE)) {
3336190c36db653e848f29d1caefc4fa1bb61e8a662Erin Dahlgren            syncFlashIndicator();
3346190c36db653e848f29d1caefc4fa1bb61e8a662Erin Dahlgren            return;
3356190c36db653e848f29d1caefc4fa1bb61e8a662Erin Dahlgren        }
3366190c36db653e848f29d1caefc4fa1bb61e8a662Erin Dahlgren        if (key.equals(Keys.KEY_CAMERA_HDR_PLUS)) {
3376190c36db653e848f29d1caefc4fa1bb61e8a662Erin Dahlgren            syncHdrIndicator();
3386190c36db653e848f29d1caefc4fa1bb61e8a662Erin Dahlgren            return;
3396190c36db653e848f29d1caefc4fa1bb61e8a662Erin Dahlgren        }
3406190c36db653e848f29d1caefc4fa1bb61e8a662Erin Dahlgren        if (key.equals(Keys.KEY_CAMERA_HDR)) {
3416190c36db653e848f29d1caefc4fa1bb61e8a662Erin Dahlgren            syncHdrIndicator();
3426190c36db653e848f29d1caefc4fa1bb61e8a662Erin Dahlgren            return;
3436190c36db653e848f29d1caefc4fa1bb61e8a662Erin Dahlgren        }
3446190c36db653e848f29d1caefc4fa1bb61e8a662Erin Dahlgren        if (key.equals(Keys.KEY_CAMERA_PANO_ORIENTATION)) {
3456190c36db653e848f29d1caefc4fa1bb61e8a662Erin Dahlgren            syncPanoIndicator();
3466190c36db653e848f29d1caefc4fa1bb61e8a662Erin Dahlgren            return;
3476190c36db653e848f29d1caefc4fa1bb61e8a662Erin Dahlgren        }
34839529585aee23703553c551eadceca78742cf52bAlan Newberger        if (key.equals(Keys.KEY_EXPOSURE)) {
3496190c36db653e848f29d1caefc4fa1bb61e8a662Erin Dahlgren            syncExposureIndicator();
3506190c36db653e848f29d1caefc4fa1bb61e8a662Erin Dahlgren            return;
3516190c36db653e848f29d1caefc4fa1bb61e8a662Erin Dahlgren        }
3526190c36db653e848f29d1caefc4fa1bb61e8a662Erin Dahlgren        if (key.equals(Keys.KEY_COUNTDOWN_DURATION)) {
3536190c36db653e848f29d1caefc4fa1bb61e8a662Erin Dahlgren            syncCountdownTimerIndicator();
3546190c36db653e848f29d1caefc4fa1bb61e8a662Erin Dahlgren            return;
355e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren        }
356e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren    }
3576c75164c89f3bbd4f894b9c49a7914a24268a999Doris Liu
358e2a1f54fbf6a8a7beff5b7695654ca21e63643afErin Dahlgren}
359