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