ButtonManager.java revision 6c75164c89f3bbd4f894b9c49a7914a24268a999
118e2ef6d2b2d36abcaa7378a0f7df792ecf8ed81Erin Dahlgren/*
218e2ef6d2b2d36abcaa7378a0f7df792ecf8ed81Erin Dahlgren * Copyright (C) 2013 The Android Open Source Project
318e2ef6d2b2d36abcaa7378a0f7df792ecf8ed81Erin Dahlgren *
418e2ef6d2b2d36abcaa7378a0f7df792ecf8ed81Erin Dahlgren * Licensed under the Apache License, Version 2.0 (the "License");
518e2ef6d2b2d36abcaa7378a0f7df792ecf8ed81Erin Dahlgren * you may not use this file except in compliance with the License.
618e2ef6d2b2d36abcaa7378a0f7df792ecf8ed81Erin Dahlgren * You may obtain a copy of the License at
718e2ef6d2b2d36abcaa7378a0f7df792ecf8ed81Erin Dahlgren *
818e2ef6d2b2d36abcaa7378a0f7df792ecf8ed81Erin Dahlgren *      http://www.apache.org/licenses/LICENSE-2.0
918e2ef6d2b2d36abcaa7378a0f7df792ecf8ed81Erin Dahlgren *
1018e2ef6d2b2d36abcaa7378a0f7df792ecf8ed81Erin Dahlgren * Unless required by applicable law or agreed to in writing, software
1118e2ef6d2b2d36abcaa7378a0f7df792ecf8ed81Erin Dahlgren * distributed under the License is distributed on an "AS IS" BASIS,
1218e2ef6d2b2d36abcaa7378a0f7df792ecf8ed81Erin Dahlgren * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1318e2ef6d2b2d36abcaa7378a0f7df792ecf8ed81Erin Dahlgren * See the License for the specific language governing permissions and
1418e2ef6d2b2d36abcaa7378a0f7df792ecf8ed81Erin Dahlgren * limitations under the License.
1518e2ef6d2b2d36abcaa7378a0f7df792ecf8ed81Erin Dahlgren */
1618e2ef6d2b2d36abcaa7378a0f7df792ecf8ed81Erin Dahlgren
1718e2ef6d2b2d36abcaa7378a0f7df792ecf8ed81Erin Dahlgrenpackage com.android.camera;
1818e2ef6d2b2d36abcaa7378a0f7df792ecf8ed81Erin Dahlgren
1959345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Spragueimport android.app.Activity;
200a6a8d8e4e1c9796aac606379a42970cdffb8911Erin Dahlgrenimport android.content.Context;
2159345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Spragueimport android.content.res.TypedArray;
22abf54e2994961395a0feb0b08353e62718443f23Spike Spragueimport android.graphics.drawable.Drawable;
2359345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Spragueimport android.view.LayoutInflater;
2418e2ef6d2b2d36abcaa7378a0f7df792ecf8ed81Erin Dahlgrenimport android.view.View;
2559345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Spragueimport android.view.ViewGroup;
2659345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Spragueimport android.widget.Button;
2718e2ef6d2b2d36abcaa7378a0f7df792ecf8ed81Erin Dahlgrenimport android.widget.ImageButton;
28e541dc2d520aae8d45f3c605c3d732e33dd3b616Spike Spragueimport android.widget.LinearLayout;
2918e2ef6d2b2d36abcaa7378a0f7df792ecf8ed81Erin Dahlgren
300a6a8d8e4e1c9796aac606379a42970cdffb8911Erin Dahlgrenimport com.android.camera.app.AppController;
31abf54e2994961395a0feb0b08353e62718443f23Spike Spragueimport com.android.camera.app.CameraAppUI;
3218e2ef6d2b2d36abcaa7378a0f7df792ecf8ed81Erin Dahlgrenimport com.android.camera.settings.SettingsManager;
3359345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Spragueimport com.android.camera.ui.RadioOptions;
34f80ac9ee5c66671c3a77ac6628fefc86cd39d57eErin Dahlgrenimport com.android.camera.util.PhotoSphereHelper;
3559345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Spragueimport com.android.camera.widget.ModeOptions;
3639f8a7647aa4051a1c260b9496c2db82f93f8667Spike Sprague
371648c36927501ff32bf2918e8a445118d5208731Erin Dahlgrenimport com.android.camera2.R;
381648c36927501ff32bf2918e8a445118d5208731Erin Dahlgren
3918e2ef6d2b2d36abcaa7378a0f7df792ecf8ed81Erin Dahlgren/**
4018e2ef6d2b2d36abcaa7378a0f7df792ecf8ed81Erin Dahlgren * A  class for generating pre-initialized
4118e2ef6d2b2d36abcaa7378a0f7df792ecf8ed81Erin Dahlgren * {@link #android.widget.ImageButton}s.
4218e2ef6d2b2d36abcaa7378a0f7df792ecf8ed81Erin Dahlgren */
431648c36927501ff32bf2918e8a445118d5208731Erin Dahlgrenpublic class ButtonManager implements SettingsManager.OnSettingChangedListener {
4418e2ef6d2b2d36abcaa7378a0f7df792ecf8ed81Erin Dahlgren
4518e2ef6d2b2d36abcaa7378a0f7df792ecf8ed81Erin Dahlgren    public static final int BUTTON_FLASH = 0;
460f3c4b4fc9ac87d7d4c3d04c3cb3426c711f57eaSpike Sprague    public static final int BUTTON_TORCH = 1;
470f3c4b4fc9ac87d7d4c3d04c3cb3426c711f57eaSpike Sprague    public static final int BUTTON_CAMERA = 2;
480f3c4b4fc9ac87d7d4c3d04c3cb3426c711f57eaSpike Sprague    public static final int BUTTON_HDRPLUS = 3;
49b1641f5df0cf839b54385ea4d2e43521620fc237Erin Dahlgren    public static final int BUTTON_HDR = 4;
50b1641f5df0cf839b54385ea4d2e43521620fc237Erin Dahlgren    public static final int BUTTON_CANCEL = 6;
51b1641f5df0cf839b54385ea4d2e43521620fc237Erin Dahlgren    public static final int BUTTON_DONE = 7;
52b1641f5df0cf839b54385ea4d2e43521620fc237Erin Dahlgren    public static final int BUTTON_RETAKE = 8;
53b1641f5df0cf839b54385ea4d2e43521620fc237Erin Dahlgren    public static final int BUTTON_REVIEW = 9;
54f80ac9ee5c66671c3a77ac6628fefc86cd39d57eErin Dahlgren    public static final int BUTTON_GRID_LINES = 11;
55abf54e2994961395a0feb0b08353e62718443f23Spike Sprague    public static final int BUTTON_EXPOSURE_COMPENSATION = 12;
566c75164c89f3bbd4f894b9c49a7914a24268a999Doris Liu    public static final int BUTTON_COUNTDOWN = 13;
574efa8b54c1df4e06f2d3caed2568015a737f9ddaErin Dahlgren
581848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren    /** For two state MultiToggleImageButtons, the off index. */
594efa8b54c1df4e06f2d3caed2568015a737f9ddaErin Dahlgren    public static final int OFF = 0;
601848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren    /** For two state MultiToggleImageButtons, the on index. */
614efa8b54c1df4e06f2d3caed2568015a737f9ddaErin Dahlgren    public static final int ON = 1;
6218e2ef6d2b2d36abcaa7378a0f7df792ecf8ed81Erin Dahlgren
6318e2ef6d2b2d36abcaa7378a0f7df792ecf8ed81Erin Dahlgren    /** A reference to the application's settings manager. */
6458598dc16e1f5a747fe1407ec1641a5529f423e5Sascha Haeberling    private final SettingsManager mSettingsManager;
6518e2ef6d2b2d36abcaa7378a0f7df792ecf8ed81Erin Dahlgren
66a1fab413bcbe5f62ae1d829bac0539519fef96a6Erin Dahlgren    /** Bottom bar options toggle buttons. */
67a9ceaf76b72cb4b499d3d9d90f979bae93bd593dErin Dahlgren    private MultiToggleImageButton mButtonCamera;
68a9ceaf76b72cb4b499d3d9d90f979bae93bd593dErin Dahlgren    private MultiToggleImageButton mButtonFlash;
69a9ceaf76b72cb4b499d3d9d90f979bae93bd593dErin Dahlgren    private MultiToggleImageButton mButtonHdr;
70a9ceaf76b72cb4b499d3d9d90f979bae93bd593dErin Dahlgren    private MultiToggleImageButton mButtonGridlines;
716c75164c89f3bbd4f894b9c49a7914a24268a999Doris Liu    private MultiToggleImageButton mButtonCountdown;
721848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren
731848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren    /** Intent UI buttons. */
741848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren    private ImageButton mButtonCancel;
751848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren    private ImageButton mButtonDone;
761848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren    private ImageButton mButtonRetake; // same as review.
771848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren
78abf54e2994961395a0feb0b08353e62718443f23Spike Sprague    private ImageButton mButtonExposureCompensation;
79abf54e2994961395a0feb0b08353e62718443f23Spike Sprague    private ImageButton mExposureN2;
80abf54e2994961395a0feb0b08353e62718443f23Spike Sprague    private ImageButton mExposureN1;
81abf54e2994961395a0feb0b08353e62718443f23Spike Sprague    private ImageButton mExposure0;
82abf54e2994961395a0feb0b08353e62718443f23Spike Sprague    private ImageButton mExposureP1;
83abf54e2994961395a0feb0b08353e62718443f23Spike Sprague    private ImageButton mExposureP2;
8459345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague    private RadioOptions mModeOptionsExposure;
8559345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague    private RadioOptions mModeOptionsPano;
8659345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague    private View mModeOptionsButtons;
8759345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague    private ModeOptions mModeOptions;
88abf54e2994961395a0feb0b08353e62718443f23Spike Sprague
89a479fcaad5b83c8fbb881f491d93145531b25cbaSpike Sprague    private int mMinExposureCompensation;
90a479fcaad5b83c8fbb881f491d93145531b25cbaSpike Sprague    private int mMaxExposureCompensation;
91a479fcaad5b83c8fbb881f491d93145531b25cbaSpike Sprague    private float mExposureCompensationStep;
92a479fcaad5b83c8fbb881f491d93145531b25cbaSpike Sprague
931848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren    /** A listener for button enabled and visibility
941848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren        state changes. */
951848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren    private ButtonStatusListener mListener;
961848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren
970a6a8d8e4e1c9796aac606379a42970cdffb8911Erin Dahlgren    /** An reference to the gcam mode index. */
980a6a8d8e4e1c9796aac606379a42970cdffb8911Erin Dahlgren    private static int sGcamIndex;
990a6a8d8e4e1c9796aac606379a42970cdffb8911Erin Dahlgren
1000a6a8d8e4e1c9796aac606379a42970cdffb8911Erin Dahlgren    private AppController mAppController;
1016b174190b43bb4c2d7a5493e4f117ef6aac5f684Spike Sprague
1028a2933b2c0156b752425b499f3081e4ffc350061Erin Dahlgren    /**
1038a2933b2c0156b752425b499f3081e4ffc350061Erin Dahlgren     * Get a new global ButtonManager.
1048a2933b2c0156b752425b499f3081e4ffc350061Erin Dahlgren     */
1050a6a8d8e4e1c9796aac606379a42970cdffb8911Erin Dahlgren    public ButtonManager(AppController app) {
1060a6a8d8e4e1c9796aac606379a42970cdffb8911Erin Dahlgren        mAppController = app;
1070a6a8d8e4e1c9796aac606379a42970cdffb8911Erin Dahlgren
1080a6a8d8e4e1c9796aac606379a42970cdffb8911Erin Dahlgren        Context context = app.getAndroidContext();
1090a6a8d8e4e1c9796aac606379a42970cdffb8911Erin Dahlgren        sGcamIndex = context.getResources().getInteger(R.integer.camera_mode_gcam);
1100a6a8d8e4e1c9796aac606379a42970cdffb8911Erin Dahlgren
1110a6a8d8e4e1c9796aac606379a42970cdffb8911Erin Dahlgren        mSettingsManager = app.getSettingsManager();
1121648c36927501ff32bf2918e8a445118d5208731Erin Dahlgren        mSettingsManager.addListener(this);
1131648c36927501ff32bf2918e8a445118d5208731Erin Dahlgren    }
1141648c36927501ff32bf2918e8a445118d5208731Erin Dahlgren
1151848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren    /**
116f1b2e407b20ff16fe793158c598e59799c1990efErin Dahlgren     * Load references to buttons under a root View.
117f1b2e407b20ff16fe793158c598e59799c1990efErin Dahlgren     * Call this after the root clears/reloads all of its children
118f1b2e407b20ff16fe793158c598e59799c1990efErin Dahlgren     * to prevent stale references button views.
119f1b2e407b20ff16fe793158c598e59799c1990efErin Dahlgren     */
120f1b2e407b20ff16fe793158c598e59799c1990efErin Dahlgren    public void load(View root) {
121f1b2e407b20ff16fe793158c598e59799c1990efErin Dahlgren        getButtonsReferences(root);
122f1b2e407b20ff16fe793158c598e59799c1990efErin Dahlgren    }
123f1b2e407b20ff16fe793158c598e59799c1990efErin Dahlgren
124f1b2e407b20ff16fe793158c598e59799c1990efErin Dahlgren    /**
1251848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren     * ButtonStatusListener provides callbacks for when button's
1261848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren     * visibility changes and enabled status changes.
1271848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren     */
1281848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren    public interface ButtonStatusListener {
1291848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren        /**
1301848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren         * A button's visibility has changed.
1311848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren         */
1321848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren        public void onButtonVisibilityChanged(ButtonManager buttonManager, int buttonId);
1331848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren
1341848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren        /**
1351848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren         * A button's enabled state has changed.
1361848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren         */
1371848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren        public void onButtonEnabledChanged(ButtonManager buttonManager, int buttonId);
1381848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren    }
1391848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren
1401848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren    /**
1411848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren     * Sets the ButtonStatusListener.
1421848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren     */
1431848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren    public void setListener(ButtonStatusListener listener) {
1441848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren        mListener = listener;
1451848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren    }
1461848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren
1471848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren    /**
1481848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren     * Gets references to all known buttons.
1491848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren     */
1500a6a8d8e4e1c9796aac606379a42970cdffb8911Erin Dahlgren    private void getButtonsReferences(View root) {
151a9ceaf76b72cb4b499d3d9d90f979bae93bd593dErin Dahlgren        mButtonCamera
1520a6a8d8e4e1c9796aac606379a42970cdffb8911Erin Dahlgren            = (MultiToggleImageButton) root.findViewById(R.id.camera_toggle_button);
153a9ceaf76b72cb4b499d3d9d90f979bae93bd593dErin Dahlgren        mButtonFlash
154a1fab413bcbe5f62ae1d829bac0539519fef96a6Erin Dahlgren            = (MultiToggleImageButton) root.findViewById(R.id.flash_toggle_button);
155a9ceaf76b72cb4b499d3d9d90f979bae93bd593dErin Dahlgren        mButtonHdr
1560a6a8d8e4e1c9796aac606379a42970cdffb8911Erin Dahlgren            = (MultiToggleImageButton) root.findViewById(R.id.hdr_plus_toggle_button);
157a9ceaf76b72cb4b499d3d9d90f979bae93bd593dErin Dahlgren        mButtonGridlines
158d5e51466a2848f1c937656c8f8185290034c2429Erin Dahlgren            = (MultiToggleImageButton) root.findViewById(R.id.grid_lines_toggle_button);
1591848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren        mButtonCancel
1600a6a8d8e4e1c9796aac606379a42970cdffb8911Erin Dahlgren            = (ImageButton) root.findViewById(R.id.cancel_button);
1611848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren        mButtonDone
1620a6a8d8e4e1c9796aac606379a42970cdffb8911Erin Dahlgren            = (ImageButton) root.findViewById(R.id.done_button);
1631848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren        mButtonRetake
1640a6a8d8e4e1c9796aac606379a42970cdffb8911Erin Dahlgren            = (ImageButton) root.findViewById(R.id.retake_button);
165abf54e2994961395a0feb0b08353e62718443f23Spike Sprague
166abf54e2994961395a0feb0b08353e62718443f23Spike Sprague        mButtonExposureCompensation =
167abf54e2994961395a0feb0b08353e62718443f23Spike Sprague            (ImageButton) root.findViewById(R.id.exposure_button);
168abf54e2994961395a0feb0b08353e62718443f23Spike Sprague        mExposureN2 = (ImageButton) root.findViewById(R.id.exposure_n2);
169abf54e2994961395a0feb0b08353e62718443f23Spike Sprague        mExposureN1 = (ImageButton) root.findViewById(R.id.exposure_n1);
170abf54e2994961395a0feb0b08353e62718443f23Spike Sprague        mExposure0 = (ImageButton) root.findViewById(R.id.exposure_0);
171abf54e2994961395a0feb0b08353e62718443f23Spike Sprague        mExposureP1 = (ImageButton) root.findViewById(R.id.exposure_p1);
172abf54e2994961395a0feb0b08353e62718443f23Spike Sprague        mExposureP2 = (ImageButton) root.findViewById(R.id.exposure_p2);
17359345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague        mModeOptionsExposure = (RadioOptions) root.findViewById(R.id.mode_options_exposure);
17459345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague        mModeOptionsPano = (RadioOptions) root.findViewById(R.id.mode_options_pano);
17559345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague        mModeOptionsButtons = root.findViewById(R.id.mode_options_buttons);
17659345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague        mModeOptions = (ModeOptions) root.findViewById(R.id.mode_options);
1776c75164c89f3bbd4f894b9c49a7914a24268a999Doris Liu
1786c75164c89f3bbd4f894b9c49a7914a24268a999Doris Liu        mButtonCountdown = (MultiToggleImageButton) root.findViewById(R.id.countdown_toggle_button);
1791848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren    }
1801648c36927501ff32bf2918e8a445118d5208731Erin Dahlgren
1811648c36927501ff32bf2918e8a445118d5208731Erin Dahlgren    @Override
1821648c36927501ff32bf2918e8a445118d5208731Erin Dahlgren    public void onSettingChanged(SettingsManager settingsManager, int id) {
1831648c36927501ff32bf2918e8a445118d5208731Erin Dahlgren        MultiToggleImageButton button = null;
1841648c36927501ff32bf2918e8a445118d5208731Erin Dahlgren        int index = 0;
1851648c36927501ff32bf2918e8a445118d5208731Erin Dahlgren
1861648c36927501ff32bf2918e8a445118d5208731Erin Dahlgren        switch (id) {
1871648c36927501ff32bf2918e8a445118d5208731Erin Dahlgren            case SettingsManager.SETTING_FLASH_MODE: {
1881648c36927501ff32bf2918e8a445118d5208731Erin Dahlgren                index = mSettingsManager.getStringValueIndex(id);
1891848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren                button = getButtonOrError(BUTTON_FLASH);
1901648c36927501ff32bf2918e8a445118d5208731Erin Dahlgren                break;
1911648c36927501ff32bf2918e8a445118d5208731Erin Dahlgren            }
1921648c36927501ff32bf2918e8a445118d5208731Erin Dahlgren            case SettingsManager.SETTING_VIDEOCAMERA_FLASH_MODE: {
1931648c36927501ff32bf2918e8a445118d5208731Erin Dahlgren                index = mSettingsManager.getStringValueIndex(id);
1941848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren                button = getButtonOrError(BUTTON_TORCH);
1951648c36927501ff32bf2918e8a445118d5208731Erin Dahlgren                break;
1961648c36927501ff32bf2918e8a445118d5208731Erin Dahlgren            }
1971648c36927501ff32bf2918e8a445118d5208731Erin Dahlgren            case SettingsManager.SETTING_CAMERA_ID: {
1981648c36927501ff32bf2918e8a445118d5208731Erin Dahlgren                index = mSettingsManager.getStringValueIndex(id);
1991848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren                button = getButtonOrError(BUTTON_CAMERA);
2001648c36927501ff32bf2918e8a445118d5208731Erin Dahlgren                break;
2011648c36927501ff32bf2918e8a445118d5208731Erin Dahlgren            }
2028ad8ad4841f65ee89e3c5e79f57d95cf8e4438b4Doris Liu            case SettingsManager.SETTING_CAMERA_HDR_PLUS: {
2031648c36927501ff32bf2918e8a445118d5208731Erin Dahlgren                index = mSettingsManager.getStringValueIndex(id);
2041848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren                button = getButtonOrError(BUTTON_HDRPLUS);
2051648c36927501ff32bf2918e8a445118d5208731Erin Dahlgren                break;
2061648c36927501ff32bf2918e8a445118d5208731Erin Dahlgren            }
2078ad8ad4841f65ee89e3c5e79f57d95cf8e4438b4Doris Liu            case SettingsManager.SETTING_CAMERA_HDR: {
2088ad8ad4841f65ee89e3c5e79f57d95cf8e4438b4Doris Liu                index = mSettingsManager.getStringValueIndex(id);
2098ad8ad4841f65ee89e3c5e79f57d95cf8e4438b4Doris Liu                button = getButtonOrError(BUTTON_HDR);
2108ad8ad4841f65ee89e3c5e79f57d95cf8e4438b4Doris Liu                break;
2118ad8ad4841f65ee89e3c5e79f57d95cf8e4438b4Doris Liu            }
212d5e51466a2848f1c937656c8f8185290034c2429Erin Dahlgren            case SettingsManager.SETTING_CAMERA_GRID_LINES: {
213d5e51466a2848f1c937656c8f8185290034c2429Erin Dahlgren                index = mSettingsManager.getStringValueIndex(id);
214d5e51466a2848f1c937656c8f8185290034c2429Erin Dahlgren                button = getButtonOrError(BUTTON_GRID_LINES);
215d5e51466a2848f1c937656c8f8185290034c2429Erin Dahlgren                break;
216d5e51466a2848f1c937656c8f8185290034c2429Erin Dahlgren            }
217f80ac9ee5c66671c3a77ac6628fefc86cd39d57eErin Dahlgren            case SettingsManager.SETTING_CAMERA_PANO_ORIENTATION: {
21859345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague                updatePanoButtons();
219f80ac9ee5c66671c3a77ac6628fefc86cd39d57eErin Dahlgren                break;
220f80ac9ee5c66671c3a77ac6628fefc86cd39d57eErin Dahlgren            }
221abf54e2994961395a0feb0b08353e62718443f23Spike Sprague            case SettingsManager.SETTING_EXPOSURE_COMPENSATION_VALUE: {
222abf54e2994961395a0feb0b08353e62718443f23Spike Sprague                updateExposureButtons();
223abf54e2994961395a0feb0b08353e62718443f23Spike Sprague                break;
224abf54e2994961395a0feb0b08353e62718443f23Spike Sprague            }
2256c75164c89f3bbd4f894b9c49a7914a24268a999Doris Liu            case SettingsManager.SETTING_COUNTDOWN_DURATION: {
2266c75164c89f3bbd4f894b9c49a7914a24268a999Doris Liu                index = mSettingsManager.getStringValueIndex(id);
2276c75164c89f3bbd4f894b9c49a7914a24268a999Doris Liu                button = getButtonOrError(BUTTON_COUNTDOWN);
2286c75164c89f3bbd4f894b9c49a7914a24268a999Doris Liu                break;
2296c75164c89f3bbd4f894b9c49a7914a24268a999Doris Liu            }
2301648c36927501ff32bf2918e8a445118d5208731Erin Dahlgren            default: {
2311648c36927501ff32bf2918e8a445118d5208731Erin Dahlgren                // Do nothing.
2321648c36927501ff32bf2918e8a445118d5208731Erin Dahlgren            }
2331648c36927501ff32bf2918e8a445118d5208731Erin Dahlgren        }
2341648c36927501ff32bf2918e8a445118d5208731Erin Dahlgren
2351648c36927501ff32bf2918e8a445118d5208731Erin Dahlgren        // In case SharedPreferences has changed but the button hasn't been toggled,
2361648c36927501ff32bf2918e8a445118d5208731Erin Dahlgren        // make sure the toggle state is in sync.
2371648c36927501ff32bf2918e8a445118d5208731Erin Dahlgren        if (button != null && button.getState() != index) {
2381648c36927501ff32bf2918e8a445118d5208731Erin Dahlgren            button.setState(Math.max(index, 0), false);
2391648c36927501ff32bf2918e8a445118d5208731Erin Dahlgren        }
24018e2ef6d2b2d36abcaa7378a0f7df792ecf8ed81Erin Dahlgren    }
24118e2ef6d2b2d36abcaa7378a0f7df792ecf8ed81Erin Dahlgren
24218e2ef6d2b2d36abcaa7378a0f7df792ecf8ed81Erin Dahlgren    /**
24318e2ef6d2b2d36abcaa7378a0f7df792ecf8ed81Erin Dahlgren     * A callback executed in the state listener of a button.
2441848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren
2458a2933b2c0156b752425b499f3081e4ffc350061Erin Dahlgren     * Used by a module to set specific behavior when a button's
24618e2ef6d2b2d36abcaa7378a0f7df792ecf8ed81Erin Dahlgren     * state changes.
24718e2ef6d2b2d36abcaa7378a0f7df792ecf8ed81Erin Dahlgren     */
24818e2ef6d2b2d36abcaa7378a0f7df792ecf8ed81Erin Dahlgren    public interface ButtonCallback {
24918e2ef6d2b2d36abcaa7378a0f7df792ecf8ed81Erin Dahlgren        public void onStateChanged(int state);
25018e2ef6d2b2d36abcaa7378a0f7df792ecf8ed81Erin Dahlgren    }
25118e2ef6d2b2d36abcaa7378a0f7df792ecf8ed81Erin Dahlgren
2521848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren    /**
2531848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren     * Returns the appropriate {@link com.android.camera.MultiToggleImageButton}
2541848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren     * based on button id.  An IllegalStateException will be throw if the
2551848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren     * button could not be found in the view hierarchy.
2561848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren     */
2571848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren    private MultiToggleImageButton getButtonOrError(int buttonId) {
2581848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren        switch (buttonId) {
2591848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren            case BUTTON_FLASH:
260a9ceaf76b72cb4b499d3d9d90f979bae93bd593dErin Dahlgren                if (mButtonFlash == null) {
2618a2933b2c0156b752425b499f3081e4ffc350061Erin Dahlgren                    throw new IllegalStateException("Flash button could not be found.");
2621848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren                }
263a9ceaf76b72cb4b499d3d9d90f979bae93bd593dErin Dahlgren                return mButtonFlash;
2641848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren            case BUTTON_TORCH:
265a9ceaf76b72cb4b499d3d9d90f979bae93bd593dErin Dahlgren                if (mButtonFlash== null) {
2660f3c4b4fc9ac87d7d4c3d04c3cb3426c711f57eaSpike Sprague                    throw new IllegalStateException("Torch button could not be found.");
2671848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren                }
268a9ceaf76b72cb4b499d3d9d90f979bae93bd593dErin Dahlgren                return mButtonFlash;
2691848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren            case BUTTON_CAMERA:
270a9ceaf76b72cb4b499d3d9d90f979bae93bd593dErin Dahlgren                if (mButtonCamera == null) {
2718a2933b2c0156b752425b499f3081e4ffc350061Erin Dahlgren                    throw new IllegalStateException("Camera button could not be found.");
2721848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren                }
273a9ceaf76b72cb4b499d3d9d90f979bae93bd593dErin Dahlgren                return mButtonCamera;
2741848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren            case BUTTON_HDRPLUS:
275a9ceaf76b72cb4b499d3d9d90f979bae93bd593dErin Dahlgren                if (mButtonHdr == null) {
276a1fab413bcbe5f62ae1d829bac0539519fef96a6Erin Dahlgren                    throw new IllegalStateException("Hdr plus button could not be found.");
2771848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren                }
278a9ceaf76b72cb4b499d3d9d90f979bae93bd593dErin Dahlgren                return mButtonHdr;
279b1641f5df0cf839b54385ea4d2e43521620fc237Erin Dahlgren            case BUTTON_HDR:
280a9ceaf76b72cb4b499d3d9d90f979bae93bd593dErin Dahlgren                if (mButtonHdr == null) {
281b1641f5df0cf839b54385ea4d2e43521620fc237Erin Dahlgren                    throw new IllegalStateException("Hdr button could not be found.");
282b1641f5df0cf839b54385ea4d2e43521620fc237Erin Dahlgren                }
283a9ceaf76b72cb4b499d3d9d90f979bae93bd593dErin Dahlgren                return mButtonHdr;
284d5e51466a2848f1c937656c8f8185290034c2429Erin Dahlgren            case BUTTON_GRID_LINES:
285a9ceaf76b72cb4b499d3d9d90f979bae93bd593dErin Dahlgren                if (mButtonGridlines == null) {
286d5e51466a2848f1c937656c8f8185290034c2429Erin Dahlgren                    throw new IllegalStateException("Grid lines button could not be found.");
287d5e51466a2848f1c937656c8f8185290034c2429Erin Dahlgren                }
288a9ceaf76b72cb4b499d3d9d90f979bae93bd593dErin Dahlgren                return mButtonGridlines;
2896c75164c89f3bbd4f894b9c49a7914a24268a999Doris Liu            case BUTTON_COUNTDOWN:
2906c75164c89f3bbd4f894b9c49a7914a24268a999Doris Liu                if (mButtonCountdown == null) {
2916c75164c89f3bbd4f894b9c49a7914a24268a999Doris Liu                    throw new IllegalStateException("Countdown button could not be found.");
2926c75164c89f3bbd4f894b9c49a7914a24268a999Doris Liu                }
2936c75164c89f3bbd4f894b9c49a7914a24268a999Doris Liu                return mButtonCountdown;
2941848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren            default:
2951848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren                throw new IllegalArgumentException("button not known by id=" + buttonId);
2968a2933b2c0156b752425b499f3081e4ffc350061Erin Dahlgren        }
2978a2933b2c0156b752425b499f3081e4ffc350061Erin Dahlgren    }
29818e2ef6d2b2d36abcaa7378a0f7df792ecf8ed81Erin Dahlgren
2991848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren    /**
3001848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren     * Returns the appropriate {@link android.widget.ImageButton}
3011848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren     * based on button id.  An IllegalStateException will be throw if the
3021848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren     * button could not be found in the view hierarchy.
3031848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren     */
3041848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren    private ImageButton getImageButtonOrError(int buttonId) {
3051848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren        switch (buttonId) {
3061848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren            case BUTTON_CANCEL:
3071848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren                if (mButtonCancel == null) {
308eb3134f6ecc42f7d98625ca2c0ddfb06c9f07c43Spike Sprague                    throw new IllegalStateException("Cancel button could not be found.");
3091848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren                }
3101848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren                return mButtonCancel;
3111848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren            case BUTTON_DONE:
3121848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren                if (mButtonDone == null) {
313eb3134f6ecc42f7d98625ca2c0ddfb06c9f07c43Spike Sprague                    throw new IllegalStateException("Done button could not be found.");
3141848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren                }
3151848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren                return mButtonDone;
3161848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren            case BUTTON_RETAKE:
3171848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren                if (mButtonRetake == null) {
318eb3134f6ecc42f7d98625ca2c0ddfb06c9f07c43Spike Sprague                    throw new IllegalStateException("Retake button could not be found.");
3191848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren                }
3201848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren                return mButtonRetake;
3211848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren            case BUTTON_REVIEW:
3221848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren                if (mButtonRetake == null) {
323db44ef57cdb576704b1aafb2b81e30bf9ff261adSpike Sprague                    throw new IllegalStateException("Review button could not be found.");
3241848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren                }
3251848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren                return mButtonRetake;
326abf54e2994961395a0feb0b08353e62718443f23Spike Sprague            case BUTTON_EXPOSURE_COMPENSATION:
327abf54e2994961395a0feb0b08353e62718443f23Spike Sprague                if (mButtonExposureCompensation == null) {
328abf54e2994961395a0feb0b08353e62718443f23Spike Sprague                    throw new IllegalStateException("Exposure Compensation button could not be found.");
329abf54e2994961395a0feb0b08353e62718443f23Spike Sprague                }
330abf54e2994961395a0feb0b08353e62718443f23Spike Sprague                return mButtonExposureCompensation;
3311848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren            default:
3321848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren                throw new IllegalArgumentException("button not known by id=" + buttonId);
333eb3134f6ecc42f7d98625ca2c0ddfb06c9f07c43Spike Sprague        }
334eb3134f6ecc42f7d98625ca2c0ddfb06c9f07c43Spike Sprague    }
335eb3134f6ecc42f7d98625ca2c0ddfb06c9f07c43Spike Sprague
33618e2ef6d2b2d36abcaa7378a0f7df792ecf8ed81Erin Dahlgren    /**
3378ad8ad4841f65ee89e3c5e79f57d95cf8e4438b4Doris Liu     * Initialize a known button by id, with a state change callback and
3388ad8ad4841f65ee89e3c5e79f57d95cf8e4438b4Doris Liu     * a resource id that points to an array of drawables, and then enable
3398ad8ad4841f65ee89e3c5e79f57d95cf8e4438b4Doris Liu     * the button.
34018e2ef6d2b2d36abcaa7378a0f7df792ecf8ed81Erin Dahlgren     */
3418ad8ad4841f65ee89e3c5e79f57d95cf8e4438b4Doris Liu    public void initializeButton(int buttonId, ButtonCallback cb) {
3421848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren        MultiToggleImageButton button = getButtonOrError(buttonId);
3438a2933b2c0156b752425b499f3081e4ffc350061Erin Dahlgren        switch (buttonId) {
34418e2ef6d2b2d36abcaa7378a0f7df792ecf8ed81Erin Dahlgren            case BUTTON_FLASH:
3458ad8ad4841f65ee89e3c5e79f57d95cf8e4438b4Doris Liu                initializeFlashButton(button, cb, R.array.camera_flashmode_icons);
3468a2933b2c0156b752425b499f3081e4ffc350061Erin Dahlgren                break;
3471848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren            case BUTTON_TORCH:
3488ad8ad4841f65ee89e3c5e79f57d95cf8e4438b4Doris Liu                initializeTorchButton(button, cb, R.array.video_flashmode_icons);
3491848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren                break;
35018e2ef6d2b2d36abcaa7378a0f7df792ecf8ed81Erin Dahlgren            case BUTTON_CAMERA:
3518ad8ad4841f65ee89e3c5e79f57d95cf8e4438b4Doris Liu                initializeCameraButton(button, cb, R.array.camera_id_icons);
3528a2933b2c0156b752425b499f3081e4ffc350061Erin Dahlgren                break;
35318e2ef6d2b2d36abcaa7378a0f7df792ecf8ed81Erin Dahlgren            case BUTTON_HDRPLUS:
3548ad8ad4841f65ee89e3c5e79f57d95cf8e4438b4Doris Liu                initializeHdrPlusButton(button, cb, R.array.pref_camera_hdr_plus_icons);
355b1641f5df0cf839b54385ea4d2e43521620fc237Erin Dahlgren                break;
356b1641f5df0cf839b54385ea4d2e43521620fc237Erin Dahlgren            case BUTTON_HDR:
3578ad8ad4841f65ee89e3c5e79f57d95cf8e4438b4Doris Liu                initializeHdrButton(button, cb, R.array.pref_camera_hdr_icons);
3588a2933b2c0156b752425b499f3081e4ffc350061Erin Dahlgren                break;
359d5e51466a2848f1c937656c8f8185290034c2429Erin Dahlgren            case BUTTON_GRID_LINES:
3608ad8ad4841f65ee89e3c5e79f57d95cf8e4438b4Doris Liu                initializeGridLinesButton(button, cb, R.array.grid_lines_icons);
361d5e51466a2848f1c937656c8f8185290034c2429Erin Dahlgren                break;
3626c75164c89f3bbd4f894b9c49a7914a24268a999Doris Liu            case BUTTON_COUNTDOWN:
3636c75164c89f3bbd4f894b9c49a7914a24268a999Doris Liu                initializeCountdownButton(button, cb, R.array.countdown_duration_icons);
3646c75164c89f3bbd4f894b9c49a7914a24268a999Doris Liu                break;
36518e2ef6d2b2d36abcaa7378a0f7df792ecf8ed81Erin Dahlgren            default:
3668a2933b2c0156b752425b499f3081e4ffc350061Erin Dahlgren                throw new IllegalArgumentException("button not known by id=" + buttonId);
36718e2ef6d2b2d36abcaa7378a0f7df792ecf8ed81Erin Dahlgren        }
3681848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren
3698ad8ad4841f65ee89e3c5e79f57d95cf8e4438b4Doris Liu        enableButton(buttonId);
37018e2ef6d2b2d36abcaa7378a0f7df792ecf8ed81Erin Dahlgren    }
37118e2ef6d2b2d36abcaa7378a0f7df792ecf8ed81Erin Dahlgren
3724efa8b54c1df4e06f2d3caed2568015a737f9ddaErin Dahlgren    /**
3738ad8ad4841f65ee89e3c5e79f57d95cf8e4438b4Doris Liu     * Initialize a known button with a click listener and a resource id.
3744efa8b54c1df4e06f2d3caed2568015a737f9ddaErin Dahlgren     * Sets the button visible.
3754efa8b54c1df4e06f2d3caed2568015a737f9ddaErin Dahlgren     */
3768ad8ad4841f65ee89e3c5e79f57d95cf8e4438b4Doris Liu    public void initializePushButton(int buttonId, View.OnClickListener cb,
3774efa8b54c1df4e06f2d3caed2568015a737f9ddaErin Dahlgren            int imageId) {
3781848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren        ImageButton button = getImageButtonOrError(buttonId);
3794efa8b54c1df4e06f2d3caed2568015a737f9ddaErin Dahlgren        button.setOnClickListener(cb);
3804efa8b54c1df4e06f2d3caed2568015a737f9ddaErin Dahlgren        button.setImageResource(imageId);
3811848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren
3821848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren        if (!button.isEnabled()) {
3831848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren            button.setEnabled(true);
3841848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren            if (mListener != null) {
3851848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren                mListener.onButtonEnabledChanged(this, buttonId);
3861848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren            }
3871848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren        }
388a1fab413bcbe5f62ae1d829bac0539519fef96a6Erin Dahlgren        button.setTag(R.string.tag_enabled_id, (Integer) buttonId);
389a1fab413bcbe5f62ae1d829bac0539519fef96a6Erin Dahlgren
390a1fab413bcbe5f62ae1d829bac0539519fef96a6Erin Dahlgren        if (button.getVisibility() != View.VISIBLE) {
391a1fab413bcbe5f62ae1d829bac0539519fef96a6Erin Dahlgren            button.setVisibility(View.VISIBLE);
392a1fab413bcbe5f62ae1d829bac0539519fef96a6Erin Dahlgren            if (mListener != null) {
393a1fab413bcbe5f62ae1d829bac0539519fef96a6Erin Dahlgren                mListener.onButtonVisibilityChanged(this, buttonId);
394a1fab413bcbe5f62ae1d829bac0539519fef96a6Erin Dahlgren            }
395a1fab413bcbe5f62ae1d829bac0539519fef96a6Erin Dahlgren        }
3964efa8b54c1df4e06f2d3caed2568015a737f9ddaErin Dahlgren    }
3974efa8b54c1df4e06f2d3caed2568015a737f9ddaErin Dahlgren
3984efa8b54c1df4e06f2d3caed2568015a737f9ddaErin Dahlgren    /**
3998ad8ad4841f65ee89e3c5e79f57d95cf8e4438b4Doris Liu     * Initialize a known button with a click listener. Sets the button visible.
4004efa8b54c1df4e06f2d3caed2568015a737f9ddaErin Dahlgren     */
4018ad8ad4841f65ee89e3c5e79f57d95cf8e4438b4Doris Liu    public void initializePushButton(int buttonId, View.OnClickListener cb) {
4021848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren        ImageButton button = getImageButtonOrError(buttonId);
403abf54e2994961395a0feb0b08353e62718443f23Spike Sprague        if (cb != null) {
404abf54e2994961395a0feb0b08353e62718443f23Spike Sprague            button.setOnClickListener(cb);
405abf54e2994961395a0feb0b08353e62718443f23Spike Sprague        }
4061848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren
4071848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren        if (!button.isEnabled()) {
4081848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren            button.setEnabled(true);
4091848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren            if (mListener != null) {
4101848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren                mListener.onButtonEnabledChanged(this, buttonId);
4111848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren            }
4121848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren        }
413a1fab413bcbe5f62ae1d829bac0539519fef96a6Erin Dahlgren        button.setTag(R.string.tag_enabled_id, (Integer) buttonId);
414a1fab413bcbe5f62ae1d829bac0539519fef96a6Erin Dahlgren
415a1fab413bcbe5f62ae1d829bac0539519fef96a6Erin Dahlgren        if (button.getVisibility() != View.VISIBLE) {
416a1fab413bcbe5f62ae1d829bac0539519fef96a6Erin Dahlgren            button.setVisibility(View.VISIBLE);
417a1fab413bcbe5f62ae1d829bac0539519fef96a6Erin Dahlgren            if (mListener != null) {
418a1fab413bcbe5f62ae1d829bac0539519fef96a6Erin Dahlgren                mListener.onButtonVisibilityChanged(this, buttonId);
419a1fab413bcbe5f62ae1d829bac0539519fef96a6Erin Dahlgren            }
420a1fab413bcbe5f62ae1d829bac0539519fef96a6Erin Dahlgren        }
421eb3134f6ecc42f7d98625ca2c0ddfb06c9f07c43Spike Sprague    }
422eb3134f6ecc42f7d98625ca2c0ddfb06c9f07c43Spike Sprague
42318e2ef6d2b2d36abcaa7378a0f7df792ecf8ed81Erin Dahlgren    /**
4244efa8b54c1df4e06f2d3caed2568015a737f9ddaErin Dahlgren     * Sets a button in its disabled (greyed out) state.
42518e2ef6d2b2d36abcaa7378a0f7df792ecf8ed81Erin Dahlgren     */
4261848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren    public void disableButton(int buttonId) {
4271848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren        MultiToggleImageButton button = getButtonOrError(buttonId);
4281848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren        if (button.isEnabled()) {
4291848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren            button.setEnabled(false);
4301848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren            if (mListener != null) {
4311848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren                mListener.onButtonEnabledChanged(this, buttonId);
4321848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren            }
4331848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren        }
434a1fab413bcbe5f62ae1d829bac0539519fef96a6Erin Dahlgren        button.setTag(R.string.tag_enabled_id, null);
4354efa8b54c1df4e06f2d3caed2568015a737f9ddaErin Dahlgren
4361848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren        if (button.getVisibility() != View.VISIBLE) {
4371848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren            button.setVisibility(View.VISIBLE);
4381848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren            if (mListener != null) {
4391848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren                mListener.onButtonVisibilityChanged(this, buttonId);
4401848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren            }
4411848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren        }
4424efa8b54c1df4e06f2d3caed2568015a737f9ddaErin Dahlgren    }
4434efa8b54c1df4e06f2d3caed2568015a737f9ddaErin Dahlgren
4444efa8b54c1df4e06f2d3caed2568015a737f9ddaErin Dahlgren    /**
4458ad8ad4841f65ee89e3c5e79f57d95cf8e4438b4Doris Liu     * Enables a button that has already been initialized.
4468ad8ad4841f65ee89e3c5e79f57d95cf8e4438b4Doris Liu     */
4478ad8ad4841f65ee89e3c5e79f57d95cf8e4438b4Doris Liu    public void enableButton(int buttonId) {
4488ad8ad4841f65ee89e3c5e79f57d95cf8e4438b4Doris Liu        ImageButton button = getButtonOrError(buttonId);
4498ad8ad4841f65ee89e3c5e79f57d95cf8e4438b4Doris Liu        if (!button.isEnabled()) {
4508ad8ad4841f65ee89e3c5e79f57d95cf8e4438b4Doris Liu            button.setEnabled(true);
4518ad8ad4841f65ee89e3c5e79f57d95cf8e4438b4Doris Liu            if (mListener != null) {
4528ad8ad4841f65ee89e3c5e79f57d95cf8e4438b4Doris Liu                mListener.onButtonEnabledChanged(this, buttonId);
4538ad8ad4841f65ee89e3c5e79f57d95cf8e4438b4Doris Liu            }
4548ad8ad4841f65ee89e3c5e79f57d95cf8e4438b4Doris Liu        }
4558ad8ad4841f65ee89e3c5e79f57d95cf8e4438b4Doris Liu        button.setTag(R.string.tag_enabled_id, buttonId);
4568ad8ad4841f65ee89e3c5e79f57d95cf8e4438b4Doris Liu
4578ad8ad4841f65ee89e3c5e79f57d95cf8e4438b4Doris Liu        if (button.getVisibility() != View.VISIBLE) {
4588ad8ad4841f65ee89e3c5e79f57d95cf8e4438b4Doris Liu            button.setVisibility(View.VISIBLE);
4598ad8ad4841f65ee89e3c5e79f57d95cf8e4438b4Doris Liu            if (mListener != null) {
4608ad8ad4841f65ee89e3c5e79f57d95cf8e4438b4Doris Liu                mListener.onButtonVisibilityChanged(this, buttonId);
4618ad8ad4841f65ee89e3c5e79f57d95cf8e4438b4Doris Liu            }
4628ad8ad4841f65ee89e3c5e79f57d95cf8e4438b4Doris Liu        }
4638ad8ad4841f65ee89e3c5e79f57d95cf8e4438b4Doris Liu    }
4648ad8ad4841f65ee89e3c5e79f57d95cf8e4438b4Doris Liu
4658ad8ad4841f65ee89e3c5e79f57d95cf8e4438b4Doris Liu    /**
4664efa8b54c1df4e06f2d3caed2568015a737f9ddaErin Dahlgren     * Hide a button by id.
4674efa8b54c1df4e06f2d3caed2568015a737f9ddaErin Dahlgren     */
4681848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren    public void hideButton(int buttonId) {
469a1fab413bcbe5f62ae1d829bac0539519fef96a6Erin Dahlgren        View button;
470a1fab413bcbe5f62ae1d829bac0539519fef96a6Erin Dahlgren        try {
471a1fab413bcbe5f62ae1d829bac0539519fef96a6Erin Dahlgren            button = (View) getButtonOrError(buttonId);
472a1fab413bcbe5f62ae1d829bac0539519fef96a6Erin Dahlgren        } catch (IllegalArgumentException e) {
473a1fab413bcbe5f62ae1d829bac0539519fef96a6Erin Dahlgren            button = (View) getImageButtonOrError(buttonId);
474a1fab413bcbe5f62ae1d829bac0539519fef96a6Erin Dahlgren        }
4751848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren        if (button.getVisibility() == View.VISIBLE) {
476c0ad2fbb43002cf013989489dc0321f459baf84cErin Dahlgren            button.setVisibility(View.GONE);
4771848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren            if (mListener != null) {
4781848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren                mListener.onButtonVisibilityChanged(this, buttonId);
4791848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren            }
4801848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren        }
4811848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren    }
4821848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren
48359345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague    public void setToInitialState() {
48459345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague        mModeOptions.setMainBar(ModeOptions.BAR_STANDARD);
48559345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague    }
48659345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague
487abf54e2994961395a0feb0b08353e62718443f23Spike Sprague    public void setExposureCompensationCallback(final CameraAppUI.BottomBarUISpec
488abf54e2994961395a0feb0b08353e62718443f23Spike Sprague                                        .ExposureCompensationSetCallback cb) {
489abf54e2994961395a0feb0b08353e62718443f23Spike Sprague        if (cb == null) {
49059345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague            mModeOptionsExposure.setOnOptionClickListener(null);
491abf54e2994961395a0feb0b08353e62718443f23Spike Sprague        } else {
49259345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague            mModeOptionsExposure
49359345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague                .setOnOptionClickListener(new RadioOptions.OnOptionClickListener() {
49459345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague                    @Override
49559345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague                    public void onOptionClicked(View v) {
49659345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague                        int comp = Integer.parseInt((String)(v.getTag()));
49759345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague
49859345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague                        if (mExposureCompensationStep != 0.0f) {
49959345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague                            int compValue =
50059345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague                                Math.round(comp / mExposureCompensationStep);
50159345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague                            cb.setExposure(compValue);
50259345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague                        }
503abf54e2994961395a0feb0b08353e62718443f23Spike Sprague                    }
50459345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague                });
505abf54e2994961395a0feb0b08353e62718443f23Spike Sprague        }
506abf54e2994961395a0feb0b08353e62718443f23Spike Sprague    }
507abf54e2994961395a0feb0b08353e62718443f23Spike Sprague
5081848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren    /**
509a479fcaad5b83c8fbb881f491d93145531b25cbaSpike Sprague     * Set the exposure compensation parameters supported by the current camera mode.
510a479fcaad5b83c8fbb881f491d93145531b25cbaSpike Sprague     * @param min Minimum exposure compensation value.
511a479fcaad5b83c8fbb881f491d93145531b25cbaSpike Sprague     * @param max Maximum exposure compensation value.
512a479fcaad5b83c8fbb881f491d93145531b25cbaSpike Sprague     * @param step Expsoure compensation step value.
513a479fcaad5b83c8fbb881f491d93145531b25cbaSpike Sprague     */
514a479fcaad5b83c8fbb881f491d93145531b25cbaSpike Sprague    public void setExposureCompensationParameters(int min, int max, float step) {
515a479fcaad5b83c8fbb881f491d93145531b25cbaSpike Sprague        mMaxExposureCompensation = max;
516a479fcaad5b83c8fbb881f491d93145531b25cbaSpike Sprague        mMinExposureCompensation = min;
517a479fcaad5b83c8fbb881f491d93145531b25cbaSpike Sprague        mExposureCompensationStep = step;
518a479fcaad5b83c8fbb881f491d93145531b25cbaSpike Sprague
519156f3e5b41cd2049230b1423c455763d31738693Spike Sprague
520156f3e5b41cd2049230b1423c455763d31738693Spike Sprague        setVisible(mExposureN2, (Math.round(min * step) <= -2));
521156f3e5b41cd2049230b1423c455763d31738693Spike Sprague        setVisible(mExposureN1, (Math.round(min * step) <= -1));
522156f3e5b41cd2049230b1423c455763d31738693Spike Sprague        setVisible(mExposureP1, (Math.round(max * step) >= 1));
523156f3e5b41cd2049230b1423c455763d31738693Spike Sprague        setVisible(mExposureP2, (Math.round(max * step) >= 2));
524a479fcaad5b83c8fbb881f491d93145531b25cbaSpike Sprague
525a479fcaad5b83c8fbb881f491d93145531b25cbaSpike Sprague        updateExposureButtons();
526156f3e5b41cd2049230b1423c455763d31738693Spike Sprague    }
527156f3e5b41cd2049230b1423c455763d31738693Spike Sprague
528156f3e5b41cd2049230b1423c455763d31738693Spike Sprague    private static void setVisible(View v, boolean visible) {
529156f3e5b41cd2049230b1423c455763d31738693Spike Sprague        if (visible) {
530156f3e5b41cd2049230b1423c455763d31738693Spike Sprague            v.setVisibility(View.VISIBLE);
531156f3e5b41cd2049230b1423c455763d31738693Spike Sprague        } else {
532156f3e5b41cd2049230b1423c455763d31738693Spike Sprague            v.setVisibility(View.INVISIBLE);
533156f3e5b41cd2049230b1423c455763d31738693Spike Sprague        }
534156f3e5b41cd2049230b1423c455763d31738693Spike Sprague    }
535156f3e5b41cd2049230b1423c455763d31738693Spike Sprague
536156f3e5b41cd2049230b1423c455763d31738693Spike Sprague    /**
537156f3e5b41cd2049230b1423c455763d31738693Spike Sprague     * @return The exposure compensation step value.
538156f3e5b41cd2049230b1423c455763d31738693Spike Sprague     **/
539156f3e5b41cd2049230b1423c455763d31738693Spike Sprague    public float getExposureCompensationStep() {
540156f3e5b41cd2049230b1423c455763d31738693Spike Sprague        return mExposureCompensationStep;
541a479fcaad5b83c8fbb881f491d93145531b25cbaSpike Sprague    }
542a479fcaad5b83c8fbb881f491d93145531b25cbaSpike Sprague
543a479fcaad5b83c8fbb881f491d93145531b25cbaSpike Sprague    /**
544a1fab413bcbe5f62ae1d829bac0539519fef96a6Erin Dahlgren     * Check if a button is enabled with the given button id..
5451848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren     */
5461848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren    public boolean isEnabled(int buttonId) {
547a1fab413bcbe5f62ae1d829bac0539519fef96a6Erin Dahlgren        View button;
548a1fab413bcbe5f62ae1d829bac0539519fef96a6Erin Dahlgren        try {
549a1fab413bcbe5f62ae1d829bac0539519fef96a6Erin Dahlgren            button = (View) getButtonOrError(buttonId);
550a1fab413bcbe5f62ae1d829bac0539519fef96a6Erin Dahlgren        } catch (IllegalArgumentException e) {
551a1fab413bcbe5f62ae1d829bac0539519fef96a6Erin Dahlgren            button = (View) getImageButtonOrError(buttonId);
552a1fab413bcbe5f62ae1d829bac0539519fef96a6Erin Dahlgren        }
553a1fab413bcbe5f62ae1d829bac0539519fef96a6Erin Dahlgren
554a1fab413bcbe5f62ae1d829bac0539519fef96a6Erin Dahlgren        Integer enabledId = (Integer) button.getTag(R.string.tag_enabled_id);
555a1fab413bcbe5f62ae1d829bac0539519fef96a6Erin Dahlgren        if (enabledId != null) {
556a1fab413bcbe5f62ae1d829bac0539519fef96a6Erin Dahlgren            return (enabledId.intValue() == buttonId) && button.isEnabled();
557a1fab413bcbe5f62ae1d829bac0539519fef96a6Erin Dahlgren        } else {
558a1fab413bcbe5f62ae1d829bac0539519fef96a6Erin Dahlgren            return false;
559a1fab413bcbe5f62ae1d829bac0539519fef96a6Erin Dahlgren        }
5601848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren    }
5611848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren
5621848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren    /**
5631848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren     * Check if a button is visible.
5641848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren     */
5651848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren    public boolean isVisible(int buttonId) {
566a1fab413bcbe5f62ae1d829bac0539519fef96a6Erin Dahlgren        View button;
567a1fab413bcbe5f62ae1d829bac0539519fef96a6Erin Dahlgren        try {
568a1fab413bcbe5f62ae1d829bac0539519fef96a6Erin Dahlgren            button = (View) getButtonOrError(buttonId);
569a1fab413bcbe5f62ae1d829bac0539519fef96a6Erin Dahlgren        } catch (IllegalArgumentException e) {
570a1fab413bcbe5f62ae1d829bac0539519fef96a6Erin Dahlgren            button = (View) getImageButtonOrError(buttonId);
571a1fab413bcbe5f62ae1d829bac0539519fef96a6Erin Dahlgren        }
5721848494bd09c85002d8c59d4feb8a6e0dc32871fErin Dahlgren        return (button.getVisibility() == View.VISIBLE);
5738a2933b2c0156b752425b499f3081e4ffc350061Erin Dahlgren    }
57418e2ef6d2b2d36abcaa7378a0f7df792ecf8ed81Erin Dahlgren
5758a2933b2c0156b752425b499f3081e4ffc350061Erin Dahlgren    /**
5768ad8ad4841f65ee89e3c5e79f57d95cf8e4438b4Doris Liu     * Initialize a flash button.
5778a2933b2c0156b752425b499f3081e4ffc350061Erin Dahlgren     */
5788ad8ad4841f65ee89e3c5e79f57d95cf8e4438b4Doris Liu    private void initializeFlashButton(MultiToggleImageButton button,
5798a2933b2c0156b752425b499f3081e4ffc350061Erin Dahlgren            final ButtonCallback cb, int resIdImages) {
58018e2ef6d2b2d36abcaa7378a0f7df792ecf8ed81Erin Dahlgren
58118e2ef6d2b2d36abcaa7378a0f7df792ecf8ed81Erin Dahlgren        if (resIdImages > 0) {
5828a2933b2c0156b752425b499f3081e4ffc350061Erin Dahlgren            button.overrideImageIds(resIdImages);
58318e2ef6d2b2d36abcaa7378a0f7df792ecf8ed81Erin Dahlgren        }
58479718f6c6fb60aedd09edeedb2c16d1e2f9fe02dSpike Sprague        button.overrideContentDescriptions(R.array.camera_flash_descriptions);
58579718f6c6fb60aedd09edeedb2c16d1e2f9fe02dSpike Sprague
58618e2ef6d2b2d36abcaa7378a0f7df792ecf8ed81Erin Dahlgren        int index = mSettingsManager.getStringValueIndex(SettingsManager.SETTING_FLASH_MODE);
5874efa8b54c1df4e06f2d3caed2568015a737f9ddaErin Dahlgren        button.setState(index >= 0 ? index : 0, false);
5884efa8b54c1df4e06f2d3caed2568015a737f9ddaErin Dahlgren
5898a2933b2c0156b752425b499f3081e4ffc350061Erin Dahlgren        button.setOnStateChangeListener(new MultiToggleImageButton.OnStateChangeListener() {
5906b174190b43bb4c2d7a5493e4f117ef6aac5f684Spike Sprague            @Override
5916b174190b43bb4c2d7a5493e4f117ef6aac5f684Spike Sprague            public void stateChanged(View view, int state) {
5926b174190b43bb4c2d7a5493e4f117ef6aac5f684Spike Sprague                mSettingsManager.setStringValueIndex(SettingsManager.SETTING_FLASH_MODE, state);
5936b174190b43bb4c2d7a5493e4f117ef6aac5f684Spike Sprague                if (cb != null) {
5946b174190b43bb4c2d7a5493e4f117ef6aac5f684Spike Sprague                    cb.onStateChanged(state);
59518e2ef6d2b2d36abcaa7378a0f7df792ecf8ed81Erin Dahlgren                }
5966b174190b43bb4c2d7a5493e4f117ef6aac5f684Spike Sprague            }
5976b174190b43bb4c2d7a5493e4f117ef6aac5f684Spike Sprague        });
59818e2ef6d2b2d36abcaa7378a0f7df792ecf8ed81Erin Dahlgren    }
59918e2ef6d2b2d36abcaa7378a0f7df792ecf8ed81Erin Dahlgren
60018e2ef6d2b2d36abcaa7378a0f7df792ecf8ed81Erin Dahlgren    /**
6018ad8ad4841f65ee89e3c5e79f57d95cf8e4438b4Doris Liu     * Initialize video torch button
6020f3c4b4fc9ac87d7d4c3d04c3cb3426c711f57eaSpike Sprague     */
6038ad8ad4841f65ee89e3c5e79f57d95cf8e4438b4Doris Liu    private void initializeTorchButton(MultiToggleImageButton button,
6040f3c4b4fc9ac87d7d4c3d04c3cb3426c711f57eaSpike Sprague            final ButtonCallback cb, int resIdImages) {
6054efa8b54c1df4e06f2d3caed2568015a737f9ddaErin Dahlgren
6060f3c4b4fc9ac87d7d4c3d04c3cb3426c711f57eaSpike Sprague        if (resIdImages > 0) {
6070f3c4b4fc9ac87d7d4c3d04c3cb3426c711f57eaSpike Sprague            button.overrideImageIds(resIdImages);
6080f3c4b4fc9ac87d7d4c3d04c3cb3426c711f57eaSpike Sprague        }
60979718f6c6fb60aedd09edeedb2c16d1e2f9fe02dSpike Sprague        button.overrideContentDescriptions(R.array.video_flash_descriptions);
61079718f6c6fb60aedd09edeedb2c16d1e2f9fe02dSpike Sprague
6110f3c4b4fc9ac87d7d4c3d04c3cb3426c711f57eaSpike Sprague        int index = mSettingsManager.getStringValueIndex(
6120f3c4b4fc9ac87d7d4c3d04c3cb3426c711f57eaSpike Sprague                SettingsManager.SETTING_VIDEOCAMERA_FLASH_MODE);
6134efa8b54c1df4e06f2d3caed2568015a737f9ddaErin Dahlgren        button.setState(index >= 0 ? index : 0, false);
6144efa8b54c1df4e06f2d3caed2568015a737f9ddaErin Dahlgren
6150f3c4b4fc9ac87d7d4c3d04c3cb3426c711f57eaSpike Sprague        button.setOnStateChangeListener(new MultiToggleImageButton.OnStateChangeListener() {
6166b174190b43bb4c2d7a5493e4f117ef6aac5f684Spike Sprague            @Override
6176b174190b43bb4c2d7a5493e4f117ef6aac5f684Spike Sprague            public void stateChanged(View view, int state) {
6186b174190b43bb4c2d7a5493e4f117ef6aac5f684Spike Sprague                mSettingsManager.setStringValueIndex(
6196b174190b43bb4c2d7a5493e4f117ef6aac5f684Spike Sprague                        SettingsManager.SETTING_VIDEOCAMERA_FLASH_MODE, state);
6206b174190b43bb4c2d7a5493e4f117ef6aac5f684Spike Sprague                if(cb != null) {
6216b174190b43bb4c2d7a5493e4f117ef6aac5f684Spike Sprague                    cb.onStateChanged(state);
6220f3c4b4fc9ac87d7d4c3d04c3cb3426c711f57eaSpike Sprague                }
6236b174190b43bb4c2d7a5493e4f117ef6aac5f684Spike Sprague            }
6246b174190b43bb4c2d7a5493e4f117ef6aac5f684Spike Sprague        });
6250f3c4b4fc9ac87d7d4c3d04c3cb3426c711f57eaSpike Sprague    }
6260f3c4b4fc9ac87d7d4c3d04c3cb3426c711f57eaSpike Sprague
6270f3c4b4fc9ac87d7d4c3d04c3cb3426c711f57eaSpike Sprague    /**
6288ad8ad4841f65ee89e3c5e79f57d95cf8e4438b4Doris Liu     * Initialize a camera button.
62918e2ef6d2b2d36abcaa7378a0f7df792ecf8ed81Erin Dahlgren     */
6308ad8ad4841f65ee89e3c5e79f57d95cf8e4438b4Doris Liu    private void initializeCameraButton(final MultiToggleImageButton button,
6318a2933b2c0156b752425b499f3081e4ffc350061Erin Dahlgren            final ButtonCallback cb, int resIdImages) {
63218e2ef6d2b2d36abcaa7378a0f7df792ecf8ed81Erin Dahlgren
63318e2ef6d2b2d36abcaa7378a0f7df792ecf8ed81Erin Dahlgren        if (resIdImages > 0) {
6348a2933b2c0156b752425b499f3081e4ffc350061Erin Dahlgren            button.overrideImageIds(resIdImages);
63518e2ef6d2b2d36abcaa7378a0f7df792ecf8ed81Erin Dahlgren        }
6368a2933b2c0156b752425b499f3081e4ffc350061Erin Dahlgren
63718e2ef6d2b2d36abcaa7378a0f7df792ecf8ed81Erin Dahlgren        int index = mSettingsManager.getStringValueIndex(SettingsManager.SETTING_CAMERA_ID);
6384efa8b54c1df4e06f2d3caed2568015a737f9ddaErin Dahlgren        button.setState(index >= 0 ? index : 0, false);
6398a2933b2c0156b752425b499f3081e4ffc350061Erin Dahlgren
6408a2933b2c0156b752425b499f3081e4ffc350061Erin Dahlgren        button.setOnStateChangeListener(new MultiToggleImageButton.OnStateChangeListener() {
6416b174190b43bb4c2d7a5493e4f117ef6aac5f684Spike Sprague            @Override
6426b174190b43bb4c2d7a5493e4f117ef6aac5f684Spike Sprague            public void stateChanged(View view, int state) {
6436b174190b43bb4c2d7a5493e4f117ef6aac5f684Spike Sprague                mSettingsManager.setStringValueIndex(SettingsManager.SETTING_CAMERA_ID, state);
6446b174190b43bb4c2d7a5493e4f117ef6aac5f684Spike Sprague                int cameraId = Integer.parseInt(mSettingsManager.get(
64518e2ef6d2b2d36abcaa7378a0f7df792ecf8ed81Erin Dahlgren                        SettingsManager.SETTING_CAMERA_ID));
646c8d9ad868e515ccebe1b6f52cb5fae1e6d13cbabAngus Kong                // This is a quick fix for ISE in Gcam module which can be
647c8d9ad868e515ccebe1b6f52cb5fae1e6d13cbabAngus Kong                // found by rapid pressing camera switch button. The assumption
648c8d9ad868e515ccebe1b6f52cb5fae1e6d13cbabAngus Kong                // here is that each time this button is clicked, the listener
649c8d9ad868e515ccebe1b6f52cb5fae1e6d13cbabAngus Kong                // will do something and then enable this button again.
650c8d9ad868e515ccebe1b6f52cb5fae1e6d13cbabAngus Kong                button.setEnabled(false);
6516b174190b43bb4c2d7a5493e4f117ef6aac5f684Spike Sprague                if (cb != null) {
6526b174190b43bb4c2d7a5493e4f117ef6aac5f684Spike Sprague                    cb.onStateChanged(cameraId);
65318e2ef6d2b2d36abcaa7378a0f7df792ecf8ed81Erin Dahlgren                }
654b1641f5df0cf839b54385ea4d2e43521620fc237Erin Dahlgren                mAppController.getCameraAppUI().onChangeCamera();
6556b174190b43bb4c2d7a5493e4f117ef6aac5f684Spike Sprague            }
6566b174190b43bb4c2d7a5493e4f117ef6aac5f684Spike Sprague        });
65718e2ef6d2b2d36abcaa7378a0f7df792ecf8ed81Erin Dahlgren    }
65818e2ef6d2b2d36abcaa7378a0f7df792ecf8ed81Erin Dahlgren
65918e2ef6d2b2d36abcaa7378a0f7df792ecf8ed81Erin Dahlgren    /**
6608ad8ad4841f65ee89e3c5e79f57d95cf8e4438b4Doris Liu     * Initialize an hdr plus button.
66118e2ef6d2b2d36abcaa7378a0f7df792ecf8ed81Erin Dahlgren     */
6628ad8ad4841f65ee89e3c5e79f57d95cf8e4438b4Doris Liu    private void initializeHdrPlusButton(MultiToggleImageButton button,
6638a2933b2c0156b752425b499f3081e4ffc350061Erin Dahlgren            final ButtonCallback cb, int resIdImages) {
66418e2ef6d2b2d36abcaa7378a0f7df792ecf8ed81Erin Dahlgren
66518e2ef6d2b2d36abcaa7378a0f7df792ecf8ed81Erin Dahlgren        if (resIdImages > 0) {
6668a2933b2c0156b752425b499f3081e4ffc350061Erin Dahlgren            button.overrideImageIds(resIdImages);
66718e2ef6d2b2d36abcaa7378a0f7df792ecf8ed81Erin Dahlgren        }
66879718f6c6fb60aedd09edeedb2c16d1e2f9fe02dSpike Sprague        button.overrideContentDescriptions(R.array.hdr_plus_descriptions);
6698a2933b2c0156b752425b499f3081e4ffc350061Erin Dahlgren
6708ad8ad4841f65ee89e3c5e79f57d95cf8e4438b4Doris Liu        int index = mSettingsManager.getStringValueIndex(SettingsManager.SETTING_CAMERA_HDR_PLUS);
6718ad8ad4841f65ee89e3c5e79f57d95cf8e4438b4Doris Liu        button.setState(index >= 0 ? index : 0, false);
6728ad8ad4841f65ee89e3c5e79f57d95cf8e4438b4Doris Liu
6738ad8ad4841f65ee89e3c5e79f57d95cf8e4438b4Doris Liu        button.setOnStateChangeListener(new MultiToggleImageButton.OnStateChangeListener() {
6748ad8ad4841f65ee89e3c5e79f57d95cf8e4438b4Doris Liu            @Override
6758ad8ad4841f65ee89e3c5e79f57d95cf8e4438b4Doris Liu            public void stateChanged(View view, int state) {
6768ad8ad4841f65ee89e3c5e79f57d95cf8e4438b4Doris Liu                mSettingsManager.setStringValueIndex(SettingsManager.SETTING_CAMERA_HDR_PLUS, state);
6778ad8ad4841f65ee89e3c5e79f57d95cf8e4438b4Doris Liu                if (cb != null) {
6788ad8ad4841f65ee89e3c5e79f57d95cf8e4438b4Doris Liu                    cb.onStateChanged(state);
6798ad8ad4841f65ee89e3c5e79f57d95cf8e4438b4Doris Liu                }
6808ad8ad4841f65ee89e3c5e79f57d95cf8e4438b4Doris Liu            }
6818ad8ad4841f65ee89e3c5e79f57d95cf8e4438b4Doris Liu        });
6828ad8ad4841f65ee89e3c5e79f57d95cf8e4438b4Doris Liu    }
6838ad8ad4841f65ee89e3c5e79f57d95cf8e4438b4Doris Liu
6848ad8ad4841f65ee89e3c5e79f57d95cf8e4438b4Doris Liu    /**
6858ad8ad4841f65ee89e3c5e79f57d95cf8e4438b4Doris Liu     * Initialize an hdr button.
6868ad8ad4841f65ee89e3c5e79f57d95cf8e4438b4Doris Liu     */
6878ad8ad4841f65ee89e3c5e79f57d95cf8e4438b4Doris Liu    private void initializeHdrButton(MultiToggleImageButton button,
6888ad8ad4841f65ee89e3c5e79f57d95cf8e4438b4Doris Liu            final ButtonCallback cb, int resIdImages) {
6898ad8ad4841f65ee89e3c5e79f57d95cf8e4438b4Doris Liu
6908ad8ad4841f65ee89e3c5e79f57d95cf8e4438b4Doris Liu        if (resIdImages > 0) {
6918ad8ad4841f65ee89e3c5e79f57d95cf8e4438b4Doris Liu            button.overrideImageIds(resIdImages);
6928ad8ad4841f65ee89e3c5e79f57d95cf8e4438b4Doris Liu        }
6938ad8ad4841f65ee89e3c5e79f57d95cf8e4438b4Doris Liu        button.overrideContentDescriptions(R.array.hdr_descriptions);
6948ad8ad4841f65ee89e3c5e79f57d95cf8e4438b4Doris Liu
69518e2ef6d2b2d36abcaa7378a0f7df792ecf8ed81Erin Dahlgren        int index = mSettingsManager.getStringValueIndex(SettingsManager.SETTING_CAMERA_HDR);
6964efa8b54c1df4e06f2d3caed2568015a737f9ddaErin Dahlgren        button.setState(index >= 0 ? index : 0, false);
6978a2933b2c0156b752425b499f3081e4ffc350061Erin Dahlgren
6988a2933b2c0156b752425b499f3081e4ffc350061Erin Dahlgren        button.setOnStateChangeListener(new MultiToggleImageButton.OnStateChangeListener() {
6996b174190b43bb4c2d7a5493e4f117ef6aac5f684Spike Sprague            @Override
7006b174190b43bb4c2d7a5493e4f117ef6aac5f684Spike Sprague            public void stateChanged(View view, int state) {
7016b174190b43bb4c2d7a5493e4f117ef6aac5f684Spike Sprague                mSettingsManager.setStringValueIndex(SettingsManager.SETTING_CAMERA_HDR, state);
7026b174190b43bb4c2d7a5493e4f117ef6aac5f684Spike Sprague                if (cb != null) {
7036b174190b43bb4c2d7a5493e4f117ef6aac5f684Spike Sprague                    cb.onStateChanged(state);
70418e2ef6d2b2d36abcaa7378a0f7df792ecf8ed81Erin Dahlgren                }
7056b174190b43bb4c2d7a5493e4f117ef6aac5f684Spike Sprague            }
7066b174190b43bb4c2d7a5493e4f117ef6aac5f684Spike Sprague        });
7074efa8b54c1df4e06f2d3caed2568015a737f9ddaErin Dahlgren    }
708d5e51466a2848f1c937656c8f8185290034c2429Erin Dahlgren
709abf54e2994961395a0feb0b08353e62718443f23Spike Sprague    /**
7106c75164c89f3bbd4f894b9c49a7914a24268a999Doris Liu     * Initialize a countdown timer button.
7116c75164c89f3bbd4f894b9c49a7914a24268a999Doris Liu     */
7126c75164c89f3bbd4f894b9c49a7914a24268a999Doris Liu    private void initializeCountdownButton(MultiToggleImageButton button,
7136c75164c89f3bbd4f894b9c49a7914a24268a999Doris Liu            final ButtonCallback cb, int resIdImages) {
7146c75164c89f3bbd4f894b9c49a7914a24268a999Doris Liu        if (resIdImages > 0) {
7156c75164c89f3bbd4f894b9c49a7914a24268a999Doris Liu            button.overrideImageIds(resIdImages);
7166c75164c89f3bbd4f894b9c49a7914a24268a999Doris Liu        }
7176c75164c89f3bbd4f894b9c49a7914a24268a999Doris Liu
7186c75164c89f3bbd4f894b9c49a7914a24268a999Doris Liu        int index = mSettingsManager.getStringValueIndex(
7196c75164c89f3bbd4f894b9c49a7914a24268a999Doris Liu                SettingsManager.SETTING_COUNTDOWN_DURATION);
7206c75164c89f3bbd4f894b9c49a7914a24268a999Doris Liu        button.setState(index >= 0 ? index : 0, false);
7216c75164c89f3bbd4f894b9c49a7914a24268a999Doris Liu
7226c75164c89f3bbd4f894b9c49a7914a24268a999Doris Liu        button.setOnStateChangeListener(new MultiToggleImageButton.OnStateChangeListener() {
7236c75164c89f3bbd4f894b9c49a7914a24268a999Doris Liu            @Override
7246c75164c89f3bbd4f894b9c49a7914a24268a999Doris Liu            public void stateChanged(View view, int state) {
7256c75164c89f3bbd4f894b9c49a7914a24268a999Doris Liu                mSettingsManager.setStringValueIndex(
7266c75164c89f3bbd4f894b9c49a7914a24268a999Doris Liu                        SettingsManager.SETTING_COUNTDOWN_DURATION, state);
7276c75164c89f3bbd4f894b9c49a7914a24268a999Doris Liu                if(cb != null) {
7286c75164c89f3bbd4f894b9c49a7914a24268a999Doris Liu                    cb.onStateChanged(state);
7296c75164c89f3bbd4f894b9c49a7914a24268a999Doris Liu                }
7306c75164c89f3bbd4f894b9c49a7914a24268a999Doris Liu            }
7316c75164c89f3bbd4f894b9c49a7914a24268a999Doris Liu        });
7326c75164c89f3bbd4f894b9c49a7914a24268a999Doris Liu    }
7336c75164c89f3bbd4f894b9c49a7914a24268a999Doris Liu
7346c75164c89f3bbd4f894b9c49a7914a24268a999Doris Liu    /**
735abf54e2994961395a0feb0b08353e62718443f23Spike Sprague     * Update the visual state of the manual exposure buttons
736abf54e2994961395a0feb0b08353e62718443f23Spike Sprague     */
737abf54e2994961395a0feb0b08353e62718443f23Spike Sprague    public void updateExposureButtons() {
73859345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague        String compString = mSettingsManager
73959345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague            .get(SettingsManager.SETTING_EXPOSURE_COMPENSATION_VALUE);
740a479fcaad5b83c8fbb881f491d93145531b25cbaSpike Sprague        int compValue = Integer.parseInt(compString);
741a479fcaad5b83c8fbb881f491d93145531b25cbaSpike Sprague        if (mExposureCompensationStep != 0.0f) {
742a479fcaad5b83c8fbb881f491d93145531b25cbaSpike Sprague            int comp = Math.round(compValue * mExposureCompensationStep);
74359345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague            mModeOptionsExposure.setSelectedOptionByTag(String.valueOf(comp));
744abf54e2994961395a0feb0b08353e62718443f23Spike Sprague        }
745abf54e2994961395a0feb0b08353e62718443f23Spike Sprague    }
7468ad8ad4841f65ee89e3c5e79f57d95cf8e4438b4Doris Liu
7478ad8ad4841f65ee89e3c5e79f57d95cf8e4438b4Doris Liu    /**
7488ad8ad4841f65ee89e3c5e79f57d95cf8e4438b4Doris Liu     * Initialize a grid lines button.
749d5e51466a2848f1c937656c8f8185290034c2429Erin Dahlgren     */
7508ad8ad4841f65ee89e3c5e79f57d95cf8e4438b4Doris Liu    private void initializeGridLinesButton(MultiToggleImageButton button,
751d5e51466a2848f1c937656c8f8185290034c2429Erin Dahlgren            final ButtonCallback cb, int resIdImages) {
752d5e51466a2848f1c937656c8f8185290034c2429Erin Dahlgren
753d5e51466a2848f1c937656c8f8185290034c2429Erin Dahlgren        if (resIdImages > 0) {
754d5e51466a2848f1c937656c8f8185290034c2429Erin Dahlgren            button.overrideImageIds(resIdImages);
755d5e51466a2848f1c937656c8f8185290034c2429Erin Dahlgren        }
756d5e51466a2848f1c937656c8f8185290034c2429Erin Dahlgren        button.overrideContentDescriptions(R.array.grid_lines_descriptions);
757d5e51466a2848f1c937656c8f8185290034c2429Erin Dahlgren        button.setOnStateChangeListener(new MultiToggleImageButton.OnStateChangeListener() {
758d5e51466a2848f1c937656c8f8185290034c2429Erin Dahlgren            @Override
759d5e51466a2848f1c937656c8f8185290034c2429Erin Dahlgren            public void stateChanged(View view, int state) {
760d5e51466a2848f1c937656c8f8185290034c2429Erin Dahlgren                mSettingsManager.setStringValueIndex(
761d5e51466a2848f1c937656c8f8185290034c2429Erin Dahlgren                    SettingsManager.SETTING_CAMERA_GRID_LINES, state);
762d5e51466a2848f1c937656c8f8185290034c2429Erin Dahlgren                if (cb != null) {
763d5e51466a2848f1c937656c8f8185290034c2429Erin Dahlgren                    cb.onStateChanged(state);
764d5e51466a2848f1c937656c8f8185290034c2429Erin Dahlgren                }
765d5e51466a2848f1c937656c8f8185290034c2429Erin Dahlgren            }
766d5e51466a2848f1c937656c8f8185290034c2429Erin Dahlgren        });
767d5e51466a2848f1c937656c8f8185290034c2429Erin Dahlgren
768d5e51466a2848f1c937656c8f8185290034c2429Erin Dahlgren        int index = mSettingsManager.getStringValueIndex(
769d5e51466a2848f1c937656c8f8185290034c2429Erin Dahlgren            SettingsManager.SETTING_CAMERA_GRID_LINES);
770d5e51466a2848f1c937656c8f8185290034c2429Erin Dahlgren        button.setState(index >= 0 ? index : 0, true);
771d5e51466a2848f1c937656c8f8185290034c2429Erin Dahlgren    }
772f80ac9ee5c66671c3a77ac6628fefc86cd39d57eErin Dahlgren
77359345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague    public boolean isPanoEnabled() {
77459345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague        return mModeOptions.getMainBar() == ModeOptions.BAR_PANO;
77559345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague    }
77659345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague
777f80ac9ee5c66671c3a77ac6628fefc86cd39d57eErin Dahlgren   /**
77859345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague     * Initialize a panorama orientation buttons.
779f80ac9ee5c66671c3a77ac6628fefc86cd39d57eErin Dahlgren     */
78059345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague    public void initializePanoOrientationButtons(final ButtonCallback cb) {
78159345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague        int resIdImages = PhotoSphereHelper.getPanoramaOrientationOptionArrayId();
78259345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague        int resIdDescriptions = PhotoSphereHelper.getPanoramaOrientationDescriptions();
783f80ac9ee5c66671c3a77ac6628fefc86cd39d57eErin Dahlgren        if (resIdImages > 0) {
78459345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague            TypedArray imageIds = null;
78559345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague            TypedArray descriptionIds = null;
78659345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague            try {
78759345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague                mModeOptions.setMainBar(ModeOptions.BAR_PANO);
78859345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague                imageIds = mAppController
78959345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague                    .getAndroidContext().getResources().obtainTypedArray(resIdImages);
79059345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague                descriptionIds = mAppController
79159345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague                    .getAndroidContext().getResources().obtainTypedArray(resIdDescriptions);
79259345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague                mModeOptionsPano.removeAllViews();
793e541dc2d520aae8d45f3c605c3d732e33dd3b616Spike Sprague                final boolean isHorizontal =
794e541dc2d520aae8d45f3c605c3d732e33dd3b616Spike Sprague                    (mModeOptionsPano.getOrientation() == LinearLayout.HORIZONTAL);
795e541dc2d520aae8d45f3c605c3d732e33dd3b616Spike Sprague                final int numImageIds = imageIds.length();
796e541dc2d520aae8d45f3c605c3d732e33dd3b616Spike Sprague                for (int index = 0; index < numImageIds; index++) {
797e541dc2d520aae8d45f3c605c3d732e33dd3b616Spike Sprague                    int i;
798e541dc2d520aae8d45f3c605c3d732e33dd3b616Spike Sprague                    // if in portrait orientation (pano bar horizonal), order buttons normally
799e541dc2d520aae8d45f3c605c3d732e33dd3b616Spike Sprague                    // if in landscape orientation (pano bar vertical), reverse button order
800e541dc2d520aae8d45f3c605c3d732e33dd3b616Spike Sprague                    if (isHorizontal) {
801e541dc2d520aae8d45f3c605c3d732e33dd3b616Spike Sprague                        i = index;
802e541dc2d520aae8d45f3c605c3d732e33dd3b616Spike Sprague                    } else {
803e541dc2d520aae8d45f3c605c3d732e33dd3b616Spike Sprague                        i = numImageIds - index - 1;
804e541dc2d520aae8d45f3c605c3d732e33dd3b616Spike Sprague                    }
805e541dc2d520aae8d45f3c605c3d732e33dd3b616Spike Sprague
80659345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague                    int imageId = imageIds.getResourceId(i, 0);
80759345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague                    if (imageId > 0) {
80859345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague                        ImageButton imageButton = (ImageButton) LayoutInflater
80959345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague                            .from(mAppController.getAndroidContext())
81059345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague                            .inflate(R.layout.mode_options_imagebutton_template,
81159345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague                                     mModeOptionsPano, false);
81259345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague                        imageButton.setImageResource(imageId);
81359345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague                        imageButton.setTag(String.valueOf(i));
81459345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague                        mModeOptionsPano.addView(imageButton);
81559345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague
81659345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague                        int descriptionId = descriptionIds.getResourceId(i, 0);
81759345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague                        if (descriptionId > 0) {
81859345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague                            imageButton.setContentDescription(
81959345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague                                    mAppController.getAndroidContext().getString(descriptionId));
82059345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague                        }
82159345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague                    }
82259345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague                }
82359345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague                mModeOptionsPano.updateListeners();
82459345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague                mModeOptionsPano
82559345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague                    .setOnOptionClickListener(new RadioOptions.OnOptionClickListener() {
82659345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague                        @Override
82759345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague                        public void onOptionClicked(View v) {
82859345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague                            if (cb != null) {
82959345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague                                int state = Integer.parseInt((String)v.getTag());
83059345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague                                mSettingsManager.setStringValueIndex(
83159345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague                                    SettingsManager.SETTING_CAMERA_PANO_ORIENTATION, state);
83259345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague                                cb.onStateChanged(state);
83359345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague                            }
83459345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague                        }
83559345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague                    });
83659345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague            } finally {
83759345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague                if (imageIds != null) {
83859345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague                    imageIds.recycle();
839f80ac9ee5c66671c3a77ac6628fefc86cd39d57eErin Dahlgren                }
84059345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague                if (descriptionIds != null) {
84159345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague                    descriptionIds.recycle();
84259345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague                }
84359345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague                updatePanoButtons();
844f80ac9ee5c66671c3a77ac6628fefc86cd39d57eErin Dahlgren            }
84559345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague        }
84659345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague    }
847f80ac9ee5c66671c3a77ac6628fefc86cd39d57eErin Dahlgren
84859345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague    private void updatePanoButtons() {
84959345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague        int modeIndex = mSettingsManager
85059345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague            .getStringValueIndex(SettingsManager.SETTING_CAMERA_PANO_ORIENTATION);
85159345144c4bde59b81bb19c95cdd977c1d1a9cd4Spike Sprague        mModeOptionsPano.setSelectedOptionByTag(String.valueOf(modeIndex));
852f80ac9ee5c66671c3a77ac6628fefc86cd39d57eErin Dahlgren    }
853d5e51466a2848f1c937656c8f8185290034c2429Erin Dahlgren}
854