diff options
author | Erin Dahlgren <edahlgren@google.com> | 2014-01-07 23:11:33 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2014-01-07 23:11:34 +0000 |
commit | 37b9f92c89d6d130bd54892c157bc6b614110daf (patch) | |
tree | b6e91ea524f4dc23d7bf06bdd6a3f82cea27ec66 /src/com/android | |
parent | a3ea885b11b13fc86bc750e09355313c644d2178 (diff) | |
parent | 1848494bd09c85002d8c59d4feb8a6e0dc32871f (diff) | |
download | android_packages_apps_Camera2-37b9f92c89d6d130bd54892c157bc6b614110daf.tar.gz android_packages_apps_Camera2-37b9f92c89d6d130bd54892c157bc6b614110daf.tar.bz2 android_packages_apps_Camera2-37b9f92c89d6d130bd54892c157bc6b614110daf.zip |
Merge "Show onscreen indicators for enabled and visible options." into gb-ub-photos-denali
Diffstat (limited to 'src/com/android')
-rw-r--r-- | src/com/android/camera/ButtonManager.java | 288 | ||||
-rw-r--r-- | src/com/android/camera/CameraActivity.java | 1 | ||||
-rw-r--r-- | src/com/android/camera/PhotoUI.java | 18 | ||||
-rw-r--r-- | src/com/android/camera/VideoUI.java | 14 | ||||
-rw-r--r-- | src/com/android/camera/app/AppController.java | 6 | ||||
-rw-r--r-- | src/com/android/camera/app/CameraAppUI.java | 14 | ||||
-rw-r--r-- | src/com/android/camera/widget/IndicatorOverlay.java | 105 |
7 files changed, 330 insertions, 116 deletions
diff --git a/src/com/android/camera/ButtonManager.java b/src/com/android/camera/ButtonManager.java index c5864c595..c4ccce476 100644 --- a/src/com/android/camera/ButtonManager.java +++ b/src/com/android/camera/ButtonManager.java @@ -16,6 +16,7 @@ package com.android.camera; +import android.app.Activity; import android.view.View; import android.widget.ImageButton; import android.util.Log; @@ -40,29 +41,80 @@ public class ButtonManager implements SettingsManager.OnSettingChangedListener { public static final int BUTTON_RETAKE = 7; public static final int BUTTON_REVIEW = 8; - /** For two state MultiStateToggleButtons, the off index. */ + /** For two state MultiToggleImageButtons, the off index. */ public static final int OFF = 0; - /** For two state MultiStateToggleButtons, the on index. */ + /** For two state MultiToggleImageButtons, the on index. */ public static final int ON = 1; - /** A reference to the activity for finding button views on demand. */ - private final CameraActivity mActivity; /** A reference to the application's settings manager. */ private final SettingsManager mSettingsManager; + /** Bottom bar options buttons. */ + private MultiToggleImageButton mButtonFlash; // same as torch. + private MultiToggleImageButton mButtonCamera; + private MultiToggleImageButton mButtonHdrPlus; + private MultiToggleImageButton mButtonRefocus; + + /** Intent UI buttons. */ + private ImageButton mButtonCancel; + private ImageButton mButtonDone; + private ImageButton mButtonRetake; // same as review. + + /** A listener for button enabled and visibility + state changes. */ + private ButtonStatusListener mListener; + /** * Get a new global ButtonManager. */ public ButtonManager(CameraActivity activity) { - mActivity = activity; + getButtonsReferences(activity); mSettingsManager = activity.getSettingsManager(); mSettingsManager.addListener(this); } - // TODO: - // Get references to the buttons in the constructor - // to avoid looking up the buttons constantly. - // The ButtonManager can know about the particular res id of a button. + /** + * ButtonStatusListener provides callbacks for when button's + * visibility changes and enabled status changes. + */ + public interface ButtonStatusListener { + /** + * A button's visibility has changed. + */ + public void onButtonVisibilityChanged(ButtonManager buttonManager, int buttonId); + + /** + * A button's enabled state has changed. + */ + public void onButtonEnabledChanged(ButtonManager buttonManager, int buttonId); + } + + /** + * Sets the ButtonStatusListener. + */ + public void setListener(ButtonStatusListener listener) { + mListener = listener; + } + + /** + * Gets references to all known buttons. + */ + private void getButtonsReferences(Activity activity) { + mButtonFlash + = (MultiToggleImageButton) activity.findViewById(R.id.flash_toggle_button); + mButtonCamera + = (MultiToggleImageButton) activity.findViewById(R.id.camera_toggle_button); + mButtonHdrPlus + = (MultiToggleImageButton) activity.findViewById(R.id.hdr_plus_toggle_button); + mButtonRefocus + = (MultiToggleImageButton) activity.findViewById(R.id.refocus_toggle_button); + mButtonCancel + = (ImageButton) activity.findViewById(R.id.cancel_button); + mButtonDone + = (ImageButton) activity.findViewById(R.id.done_button); + mButtonRetake + = (ImageButton) activity.findViewById(R.id.retake_button); + } @Override public void onSettingChanged(SettingsManager settingsManager, int id) { @@ -72,27 +124,27 @@ public class ButtonManager implements SettingsManager.OnSettingChangedListener { switch (id) { case SettingsManager.SETTING_FLASH_MODE: { index = mSettingsManager.getStringValueIndex(id); - button = getButtonOrError(BUTTON_FLASH, R.id.flash_toggle_button); + button = getButtonOrError(BUTTON_FLASH); break; } case SettingsManager.SETTING_VIDEOCAMERA_FLASH_MODE: { index = mSettingsManager.getStringValueIndex(id); - button = getButtonOrError(BUTTON_TORCH, R.id.flash_toggle_button); + button = getButtonOrError(BUTTON_TORCH); break; } case SettingsManager.SETTING_CAMERA_ID: { index = mSettingsManager.getStringValueIndex(id); - button = getButtonOrError(BUTTON_CAMERA, R.id.camera_toggle_button); + button = getButtonOrError(BUTTON_CAMERA); break; } case SettingsManager.SETTING_CAMERA_HDR: { index = mSettingsManager.getStringValueIndex(id); - button = getButtonOrError(BUTTON_HDRPLUS, R.id.hdr_plus_toggle_button); + button = getButtonOrError(BUTTON_HDRPLUS); break; } case SettingsManager.SETTING_CAMERA_REFOCUS: { index = mSettingsManager.getStringValueIndex(id); - button = getButtonOrError(BUTTON_REFOCUS, R.id.refocus_toggle_button); + button = getButtonOrError(BUTTON_REFOCUS); break; } default: { @@ -109,6 +161,7 @@ public class ButtonManager implements SettingsManager.OnSettingChangedListener { /** * A callback executed in the state listener of a button. + * Used by a module to set specific behavior when a button's * state changes. */ @@ -116,116 +169,204 @@ public class ButtonManager implements SettingsManager.OnSettingChangedListener { public void onStateChanged(int state); } - private MultiToggleImageButton getButtonOrError(int buttonId, int resId) { - MultiToggleImageButton button - = (MultiToggleImageButton) mActivity.findViewById(resId); - if (button == null) { - switch (buttonId) { - case BUTTON_FLASH: + /** + * Returns the appropriate {@link com.android.camera.MultiToggleImageButton} + * based on button id. An IllegalStateException will be throw if the + * button could not be found in the view hierarchy. + */ + private MultiToggleImageButton getButtonOrError(int buttonId) { + switch (buttonId) { + case BUTTON_FLASH: + if (mButtonFlash == null) { throw new IllegalStateException("Flash button could not be found."); - case BUTTON_TORCH: + } + return mButtonFlash; + case BUTTON_TORCH: + if (mButtonFlash == null) { throw new IllegalStateException("Torch button could not be found."); - case BUTTON_CAMERA: + } + return mButtonFlash; + case BUTTON_CAMERA: + if (mButtonCamera == null) { throw new IllegalStateException("Camera button could not be found."); - case BUTTON_HDRPLUS: + } + return mButtonCamera; + case BUTTON_HDRPLUS: + if (mButtonHdrPlus == null) { throw new IllegalStateException("Hdr button could not be found."); - case BUTTON_REFOCUS: + } + return mButtonHdrPlus; + case BUTTON_REFOCUS: + if (mButtonRefocus == null) { throw new IllegalStateException("Refocus button could not be found."); - default: - throw new IllegalArgumentException("button not known by id=" + buttonId); - } + } + return mButtonRefocus; + default: + throw new IllegalArgumentException("button not known by id=" + buttonId); } - return button; } - private ImageButton getImageButtonOrError(int buttonId, int resId) { - ImageButton button = (ImageButton) mActivity.findViewById(resId); - if (button == null) { - switch (buttonId) { - case BUTTON_CANCEL: + /** + * Returns the appropriate {@link android.widget.ImageButton} + * based on button id. An IllegalStateException will be throw if the + * button could not be found in the view hierarchy. + */ + private ImageButton getImageButtonOrError(int buttonId) { + switch (buttonId) { + case BUTTON_CANCEL: + if (mButtonCancel == null) { throw new IllegalStateException("Cancel button could not be found."); - case BUTTON_DONE: + } + return mButtonCancel; + case BUTTON_DONE: + if (mButtonDone == null) { throw new IllegalStateException("Done button could not be found."); - case BUTTON_RETAKE: + } + return mButtonDone; + case BUTTON_RETAKE: + if (mButtonRetake == null) { throw new IllegalStateException("Retake button could not be found."); - case BUTTON_REVIEW: + } + return mButtonRetake; + case BUTTON_REVIEW: + if (mButtonRetake == null) { throw new IllegalStateException("Review button could not be found."); - - default: - throw new IllegalArgumentException("button not known by id=" + buttonId); - } + } + return mButtonRetake; + default: + throw new IllegalArgumentException("button not known by id=" + buttonId); } - return button; } /** * Enable a known button by id, with a state change callback and * a resource id that points to an array of drawables. */ - public void enableButton(int buttonId, int resId, ButtonCallback cb, int resIdImages) { - MultiToggleImageButton button = getButtonOrError(buttonId, resId); + public void enableButton(int buttonId, ButtonCallback cb, int resIdImages) { + MultiToggleImageButton button = getButtonOrError(buttonId); switch (buttonId) { case BUTTON_FLASH: + if (!mSettingsManager.isCameraBackFacing()) { + disableButton(BUTTON_FLASH); + return; + } enableFlashButton(button, cb, resIdImages); break; + case BUTTON_TORCH: + if (!mSettingsManager.isCameraBackFacing()) { + disableButton(BUTTON_TORCH); + return; + } + enableTorchButton(button, cb, resIdImages); + break; case BUTTON_CAMERA: enableCameraButton(button, cb, resIdImages); break; case BUTTON_HDRPLUS: enableHdrPlusButton(button, cb, resIdImages); break; - case BUTTON_TORCH: - enableTorchButton(button, cb, resIdImages); - break; case BUTTON_REFOCUS: enableRefocusButton(button, cb, resIdImages); break; default: throw new IllegalArgumentException("button not known by id=" + buttonId); } - button.setVisibility(View.VISIBLE); + + if (!button.isEnabled()) { + button.setEnabled(true); + if (mListener != null) { + mListener.onButtonEnabledChanged(this, buttonId); + } + } + + if (button.getVisibility() != View.VISIBLE) { + button.setVisibility(View.VISIBLE); + if (mListener != null) { + mListener.onButtonVisibilityChanged(this, buttonId); + } + } } /** * Enable a known button with a click listener and a resource id. * Sets the button visible. */ - public void enablePushButton(int buttonId, int resId, View.OnClickListener cb, + public void enablePushButton(int buttonId, View.OnClickListener cb, int imageId) { - ImageButton button = getImageButtonOrError(buttonId, resId); + ImageButton button = getImageButtonOrError(buttonId); button.setOnClickListener(cb); - button.setEnabled(true); button.setImageResource(imageId); + + if (!button.isEnabled()) { + button.setEnabled(true); + if (mListener != null) { + mListener.onButtonEnabledChanged(this, buttonId); + } + } } /** * Enable a known button with a click listener. Sets the button visible. */ - public void enablePushButton(int buttonId, int resId, View.OnClickListener cb) { - ImageButton button = getImageButtonOrError(buttonId, resId); + public void enablePushButton(int buttonId, View.OnClickListener cb) { + ImageButton button = getImageButtonOrError(buttonId); button.setOnClickListener(cb); - button.setEnabled(true); + + if (!button.isEnabled()) { + button.setEnabled(true); + if (mListener != null) { + mListener.onButtonEnabledChanged(this, buttonId); + } + } } /** * Sets a button in its disabled (greyed out) state. */ - public void disableButton(int buttonId, int resId) { - MultiToggleImageButton button = getButtonOrError(buttonId, resId); - disableButton(button); - } + public void disableButton(int buttonId) { + MultiToggleImageButton button = getButtonOrError(buttonId); + if (button.isEnabled()) { + button.setEnabled(false); + if (mListener != null) { + mListener.onButtonEnabledChanged(this, buttonId); + } + } - private void disableButton(MultiToggleImageButton button) { - button.setEnabled(false); - button.setVisibility(View.VISIBLE); + if (button.getVisibility() != View.VISIBLE) { + button.setVisibility(View.VISIBLE); + if (mListener != null) { + mListener.onButtonVisibilityChanged(this, buttonId); + } + } } /** * Hide a button by id. */ - public void hideButton(int buttonId, int resId) { - MultiToggleImageButton button = getButtonOrError(buttonId, resId); - button.setVisibility(View.INVISIBLE); + public void hideButton(int buttonId) { + MultiToggleImageButton button = getButtonOrError(buttonId); + if (button.getVisibility() == View.VISIBLE) { + button.setVisibility(View.INVISIBLE); + if (mListener != null) { + mListener.onButtonVisibilityChanged(this, buttonId); + } + } + } + + /** + * Check if a button is enabled. + */ + public boolean isEnabled(int buttonId) { + MultiToggleImageButton button = getButtonOrError(buttonId); + return button.isEnabled(); + } + + /** + * Check if a button is visible. + */ + public boolean isVisible(int buttonId) { + MultiToggleImageButton button = getButtonOrError(buttonId); + return (button.getVisibility() == View.VISIBLE); } /** @@ -234,11 +375,6 @@ public class ButtonManager implements SettingsManager.OnSettingChangedListener { private void enableFlashButton(MultiToggleImageButton button, final ButtonCallback cb, int resIdImages) { - if (!mSettingsManager.isCameraBackFacing()) { - disableButton(button); - return; - } - if (resIdImages > 0) { button.overrideImageIds(resIdImages); } @@ -254,8 +390,6 @@ public class ButtonManager implements SettingsManager.OnSettingChangedListener { } } }); - - button.setEnabled(true); } /** @@ -264,11 +398,6 @@ public class ButtonManager implements SettingsManager.OnSettingChangedListener { private void enableTorchButton(MultiToggleImageButton button, final ButtonCallback cb, int resIdImages) { - if (!mSettingsManager.isCameraBackFacing()) { - disableButton(button); - return; - } - if (resIdImages > 0) { button.overrideImageIds(resIdImages); } @@ -286,8 +415,6 @@ public class ButtonManager implements SettingsManager.OnSettingChangedListener { } } }); - - button.setEnabled(true); } /** @@ -314,8 +441,6 @@ public class ButtonManager implements SettingsManager.OnSettingChangedListener { } } }); - - button.setEnabled(true); } /** @@ -340,8 +465,6 @@ public class ButtonManager implements SettingsManager.OnSettingChangedListener { } } }); - - button.setEnabled(true); } /** @@ -366,8 +489,5 @@ public class ButtonManager implements SettingsManager.OnSettingChangedListener { } } }); - - button.setEnabled(true); } - }
\ No newline at end of file diff --git a/src/com/android/camera/CameraActivity.java b/src/com/android/camera/CameraActivity.java index e749f6b50..ffc95459f 100644 --- a/src/com/android/camera/CameraActivity.java +++ b/src/com/android/camera/CameraActivity.java @@ -1436,6 +1436,7 @@ public class CameraActivity extends Activity return mSettingsController; } + @Override public ButtonManager getButtonManager() { if (mButtonManager == null) { mButtonManager = new ButtonManager(this); diff --git a/src/com/android/camera/PhotoUI.java b/src/com/android/camera/PhotoUI.java index 415102d55..50ae81ede 100644 --- a/src/com/android/camera/PhotoUI.java +++ b/src/com/android/camera/PhotoUI.java @@ -317,20 +317,20 @@ public class PhotoUI implements PreviewStatusListener, private void setupToggleButtons() { ButtonManager buttonManager = mActivity.getButtonManager(); - buttonManager.enableButton(ButtonManager.BUTTON_CAMERA, R.id.camera_toggle_button, + buttonManager.enableButton(ButtonManager.BUTTON_CAMERA, mCameraCallback, R.array.camera_id_icons); - buttonManager.enableButton(ButtonManager.BUTTON_FLASH, R.id.flash_toggle_button, + buttonManager.enableButton(ButtonManager.BUTTON_FLASH, null, R.array.camera_flashmode_icons); if (mActivity.getCurrentModuleIndex() == ModeListView.MODE_PHOTO) { // Simple photo mode. - buttonManager.hideButton(ButtonManager.BUTTON_HDRPLUS, R.id.hdr_plus_toggle_button); - buttonManager.hideButton(ButtonManager.BUTTON_REFOCUS, R.id.refocus_toggle_button); + buttonManager.hideButton(ButtonManager.BUTTON_HDRPLUS); + buttonManager.hideButton(ButtonManager.BUTTON_REFOCUS); } else { // Advanced photo mode. - buttonManager.enableButton(ButtonManager.BUTTON_HDRPLUS, R.id.hdr_plus_toggle_button, + buttonManager.enableButton(ButtonManager.BUTTON_HDRPLUS, mHdrCallback, R.array.pref_camera_hdr_plus_icons); - buttonManager.enableButton(ButtonManager.BUTTON_REFOCUS, R.id.refocus_toggle_button, + buttonManager.enableButton(ButtonManager.BUTTON_REFOCUS, mRefocusCallback, R.array.refocus_icons); } } @@ -338,11 +338,11 @@ public class PhotoUI implements PreviewStatusListener, private void setupIntentToggleButtons() { setupToggleButtons(); ButtonManager buttonManager = mActivity.getButtonManager(); - buttonManager.enablePushButton(ButtonManager.BUTTON_CANCEL, R.id.cancel_button, + buttonManager.enablePushButton(ButtonManager.BUTTON_CANCEL, mCancelCallback); - buttonManager.enablePushButton(ButtonManager.BUTTON_DONE, R.id.done_button, + buttonManager.enablePushButton(ButtonManager.BUTTON_DONE, mDoneCallback); - buttonManager.enablePushButton(ButtonManager.BUTTON_RETAKE, R.id.retake_button, + buttonManager.enablePushButton(ButtonManager.BUTTON_RETAKE, mRetakeCallback); } diff --git a/src/com/android/camera/VideoUI.java b/src/com/android/camera/VideoUI.java index a2ae5b824..273827872 100644 --- a/src/com/android/camera/VideoUI.java +++ b/src/com/android/camera/VideoUI.java @@ -155,22 +155,22 @@ public class VideoUI implements PreviewStatusListener, SurfaceHolder.Callback { private void setupToggleButtons() { ButtonManager buttonManager = mActivity.getButtonManager(); - buttonManager.enableButton(ButtonManager.BUTTON_CAMERA, R.id.camera_toggle_button, + buttonManager.enableButton(ButtonManager.BUTTON_CAMERA, mCameraCallback, R.array.camera_id_icons); - buttonManager.enableButton(ButtonManager.BUTTON_TORCH, R.id.flash_toggle_button, + buttonManager.enableButton(ButtonManager.BUTTON_TORCH, mFlashCallback, R.array.video_flashmode_icons); - buttonManager.hideButton(ButtonManager.BUTTON_HDRPLUS, R.id.hdr_plus_toggle_button); - buttonManager.hideButton(ButtonManager.BUTTON_REFOCUS, R.id.refocus_toggle_button); + buttonManager.hideButton(ButtonManager.BUTTON_HDRPLUS); + buttonManager.hideButton(ButtonManager.BUTTON_REFOCUS); } private void setupIntentToggleButtons() { setupToggleButtons(); ButtonManager buttonManager = mActivity.getButtonManager(); - buttonManager.enablePushButton(ButtonManager.BUTTON_CANCEL, R.id.cancel_button, + buttonManager.enablePushButton(ButtonManager.BUTTON_CANCEL, mCancelCallback); - buttonManager.enablePushButton(ButtonManager.BUTTON_DONE, R.id.done_button, + buttonManager.enablePushButton(ButtonManager.BUTTON_DONE, mDoneCallback); - buttonManager.enablePushButton(ButtonManager.BUTTON_REVIEW, R.id.retake_button, + buttonManager.enablePushButton(ButtonManager.BUTTON_REVIEW, mReviewCallback, R.drawable.ic_play); } diff --git a/src/com/android/camera/app/AppController.java b/src/com/android/camera/app/AppController.java index 7558411e1..ab8351876 100644 --- a/src/com/android/camera/app/AppController.java +++ b/src/com/android/camera/app/AppController.java @@ -24,6 +24,7 @@ import android.graphics.SurfaceTexture; import android.net.Uri; import android.widget.FrameLayout; +import com.android.camera.ButtonManager; import com.android.camera.app.LocationManager; import com.android.camera.ui.ModeListView; import com.android.camera.SettingsController; @@ -270,4 +271,9 @@ public interface AppController { * @return {@code null} if not available yet. */ public CameraAppUI getCameraAppUI(); + + /** + * Returns the {@link com.android.camera.ButtonManager}. + */ + public ButtonManager getButtonManager(); } diff --git a/src/com/android/camera/app/CameraAppUI.java b/src/com/android/camera/app/CameraAppUI.java index ccef400e9..7703c7ee2 100644 --- a/src/com/android/camera/app/CameraAppUI.java +++ b/src/com/android/camera/app/CameraAppUI.java @@ -550,11 +550,6 @@ public class CameraAppUI implements ModeListView.ModeSwitchListener, R.id.indicator_overlay); mTextureViewHelper.addPreviewAreaSizeChangedListener(mIndicatorOverlay); mController.getSettingsManager().addListener(mIndicatorOverlay); - // Sync the settings state with the indicator state. - // If camera specific indicators need to be set, and the camera is - // not yet opened, we will sync the indicators again when the camera is open. - mIndicatorOverlay.syncIndicators(mController.getSettingsManager(), - mController.getCurrentModuleIndex()); } /** @@ -563,8 +558,8 @@ public class CameraAppUI implements ModeListView.ModeSwitchListener, */ public void onChangeCamera() { if (mIndicatorOverlay != null) { - mIndicatorOverlay.syncIndicators(mController.getSettingsManager(), - mController.getCurrentModuleIndex()); + // Sync the settings state with the indicator state. + mIndicatorOverlay.syncIndicators(mController); } } @@ -612,6 +607,11 @@ public class CameraAppUI implements ModeListView.ModeSwitchListener, mBottomBar = (BottomBar) mAppRootView.findViewById(R.id.bottom_bar); mBottomBar.setupToggle(mIsCaptureIntent); + + mIndicatorOverlay = (IndicatorOverlay) mAppRootView.findViewById( + R.id.indicator_overlay); + mIndicatorOverlay.setController(mController); + mController.getButtonManager().setListener(mIndicatorOverlay); } // TODO: Remove this when refactor is done. diff --git a/src/com/android/camera/widget/IndicatorOverlay.java b/src/com/android/camera/widget/IndicatorOverlay.java index 5f21b076f..ba7502205 100644 --- a/src/com/android/camera/widget/IndicatorOverlay.java +++ b/src/com/android/camera/widget/IndicatorOverlay.java @@ -29,6 +29,8 @@ import android.view.WindowManager; import android.widget.ImageView; import android.widget.RelativeLayout; +import com.android.camera.ButtonManager; +import com.android.camera.app.AppController; import com.android.camera.module.ModulesInfo; import com.android.camera.settings.SettingsManager; import com.android.camera.ui.PreviewStatusListener; @@ -46,7 +48,8 @@ import com.android.camera2.R; */ public class IndicatorOverlay extends RelativeLayout implements PreviewStatusListener.PreviewAreaSizeChangedListener, - SettingsManager.OnSettingChangedListener { + SettingsManager.OnSettingChangedListener, + ButtonManager.ButtonStatusListener { private final static String TAG = "IndicatorOverlay"; private int mPreviewWidth; @@ -59,6 +62,8 @@ public class IndicatorOverlay extends RelativeLayout private TypedArray mFlashIndicatorVideoIcons; private TypedArray mHdrIndicatorIcons; + private AppController mController; + public IndicatorOverlay(Context context, AttributeSet attrs) { super(context, attrs); mFlashIndicatorPhotoIcons @@ -69,29 +74,111 @@ public class IndicatorOverlay extends RelativeLayout = context.getResources().obtainTypedArray(R.array.pref_camera_hdr_plus_icons); } + /** + * Sets a reference to the AppController so that indicators + * can be synced from listeners that have no knowledge of the app. + */ + public void setController(AppController controller) { + mController = controller; + } + @Override public void onFinishInflate() { mFlashIndicator = (ImageView) findViewById(R.id.flash_indicator); mHdrIndicator = (ImageView) findViewById(R.id.hdr_indicator); } + @Override + public void onButtonVisibilityChanged(ButtonManager buttonManager, int buttonId) { + syncIndicatorWithButton(buttonId); + } + + @Override + public void onButtonEnabledChanged(ButtonManager buttonManager, int buttonId) { + syncIndicatorWithButton(buttonId); + } + + /** + * Syncs a specific indicator's icon and visibility + * based on the enabled state and visibility of a button. + */ + private void syncIndicatorWithButton(int buttonId) { + switch (buttonId) { + case ButtonManager.BUTTON_FLASH: { + if (mController != null) { + syncFlashIndicator(mController); + } + } + case ButtonManager.BUTTON_TORCH: { + if (mController != null) { + syncFlashIndicator(mController); + } + } + case ButtonManager.BUTTON_HDRPLUS: { + if (mController != null) { + syncHdrIndicator(mController); + } + } + default: + // Do nothing. The indicator doesn't care + // about button that don't correspond to indicators. + } + } + /** * Sets all indicators to the correct resource and visibility * based on the current settings. */ - public void syncIndicators(SettingsManager settingsManager, int modeIndex) { + public void syncIndicators(AppController controller) { + if (mController == null) { + mController = controller; + } + syncFlashIndicator(mController); + syncHdrIndicator(mController); + } + + /** + * Sync the icon and visibility of the flash indicator. + */ + private void syncFlashIndicator(AppController controller) { + ButtonManager buttonManager = controller.getButtonManager(); // Sync the flash indicator. - if (modeIndex == ModulesInfo.MODULE_VIDEO) { - setIndicatorState(settingsManager, SettingsManager.SETTING_VIDEOCAMERA_FLASH_MODE, - mFlashIndicator, mFlashIndicatorVideoIcons); + // If flash isn't an enabled and visible option, + // do not show the indicator. + if (buttonManager.isEnabled(ButtonManager.BUTTON_FLASH) + && buttonManager.isVisible(ButtonManager.BUTTON_FLASH)) { + + int modeIndex = controller.getCurrentModuleIndex(); + if (modeIndex == ModulesInfo.MODULE_VIDEO) { + setIndicatorState(controller.getSettingsManager(), + SettingsManager.SETTING_VIDEOCAMERA_FLASH_MODE, + mFlashIndicator, mFlashIndicatorVideoIcons); + } else { + setIndicatorState(controller.getSettingsManager(), + SettingsManager.SETTING_FLASH_MODE, + mFlashIndicator, mFlashIndicatorPhotoIcons); + } } else { - setIndicatorState(settingsManager, SettingsManager.SETTING_FLASH_MODE, - mFlashIndicator, mFlashIndicatorPhotoIcons); + mFlashIndicator.setVisibility(View.INVISIBLE); } + } + /** + * Sync the icon and the visibility of the hdr indicator. + */ + private void syncHdrIndicator(AppController controller) { + ButtonManager buttonManager = controller.getButtonManager(); // Sync the hdr indicator. - setIndicatorState(settingsManager, SettingsManager.SETTING_CAMERA_HDR, - mHdrIndicator, mHdrIndicatorIcons); + // If hdr isn't an enabled and visible option, + // do not show the indicator. + if (buttonManager.isEnabled(ButtonManager.BUTTON_HDRPLUS) + && buttonManager.isVisible(ButtonManager.BUTTON_HDRPLUS)) { + setIndicatorState(controller.getSettingsManager(), + SettingsManager.SETTING_CAMERA_HDR, + mHdrIndicator, mHdrIndicatorIcons); + } else { + mHdrIndicator.setVisibility(View.INVISIBLE); + } } /** |