blob: 2ba1398ae775d550353ffa1efcf4b54b2495abf7 [file] [log] [blame]
/*
* Copyright (C) 2014 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.camera.widget;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.drawable.Drawable;
import android.view.View;
import android.widget.ImageView;
import com.android.camera.ButtonManager;
import com.android.camera.app.AppController;
import com.android.camera.debug.Log;
import com.android.camera.settings.Keys;
import com.android.camera.settings.SettingsManager;
import com.android.camera.util.PhotoSphereHelper;
import com.android.camera2.R;
/**
* IndicatorIconController sets the visibility and icon state of
* on screen indicators.
*
* Indicators are only visible if they are in a non-default state. The
* visibility of an indicator is set when an indicator's setting changes.
*/
public class IndicatorIconController
implements SettingsManager.OnSettingChangedListener,
ButtonManager.ButtonStatusListener {
private final static Log.Tag TAG = new Log.Tag("IndicatorIconCtrlr");
private ImageView mFlashIndicator;
private ImageView mHdrIndicator;
private ImageView mPanoIndicator;
private ImageView mCountdownTimerIndicator;
private ImageView mExposureIndicatorN2;
private ImageView mExposureIndicatorN1;
private ImageView mExposureIndicatorP1;
private ImageView mExposureIndicatorP2;
private TypedArray mFlashIndicatorPhotoIcons;
private TypedArray mFlashIndicatorVideoIcons;
private TypedArray mHdrPlusIndicatorIcons;
private TypedArray mHdrIndicatorIcons;
private TypedArray mPanoIndicatorIcons;
private TypedArray mCountdownTimerIndicatorIcons;
private AppController mController;
public IndicatorIconController(AppController controller, View root) {
mController = controller;
Context context = controller.getAndroidContext();
mFlashIndicator = (ImageView) root.findViewById(R.id.flash_indicator);
mFlashIndicatorPhotoIcons = context.getResources().obtainTypedArray(
R.array.camera_flashmode_indicator_icons);
mFlashIndicatorVideoIcons = context.getResources().obtainTypedArray(
R.array.video_flashmode_indicator_icons);
mHdrIndicator = (ImageView) root.findViewById(R.id.hdr_indicator);
mHdrPlusIndicatorIcons = context.getResources().obtainTypedArray(
R.array.pref_camera_hdr_plus_indicator_icons);
mHdrIndicatorIcons = context.getResources().obtainTypedArray(
R.array.pref_camera_hdr_indicator_icons);
int panoIndicatorArrayId = PhotoSphereHelper.getPanoramaOrientationIndicatorArrayId();
if (panoIndicatorArrayId > 0) {
mPanoIndicator = (ImageView) root.findViewById(R.id.pano_indicator);
mPanoIndicatorIcons =
context.getResources().obtainTypedArray(panoIndicatorArrayId);
}
mCountdownTimerIndicator = (ImageView) root.findViewById(R.id.countdown_timer_indicator);
mCountdownTimerIndicatorIcons = context.getResources().obtainTypedArray(
R.array.pref_camera_countdown_indicators);
mExposureIndicatorN2 = (ImageView) root.findViewById(R.id.exposure_n2_indicator);
mExposureIndicatorN1 = (ImageView) root.findViewById(R.id.exposure_n1_indicator);
mExposureIndicatorP1 = (ImageView) root.findViewById(R.id.exposure_p1_indicator);
mExposureIndicatorP2 = (ImageView) root.findViewById(R.id.exposure_p2_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: {
syncFlashIndicator();
break;
}
case ButtonManager.BUTTON_TORCH: {
syncFlashIndicator();
break;
}
case ButtonManager.BUTTON_HDR_PLUS: {
syncHdrIndicator();
break;
}
case ButtonManager.BUTTON_HDR: {
syncHdrIndicator();
break;
}
case ButtonManager.BUTTON_EXPOSURE_COMPENSATION: {
syncExposureIndicator();
break;
}
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() {
syncFlashIndicator();
syncHdrIndicator();
syncPanoIndicator();
syncExposureIndicator();
syncCountdownTimerIndicator();
}
/**
* If the new visibility is different from the current visibility
* on a view, change the visibility and call any registered
* {@link OnIndicatorVisibilityChangedListener}.
*/
private static void changeVisibility(View view, int visibility) {
if (view.getVisibility() != visibility) {
view.setVisibility(visibility);
}
}
/**
* Sync the icon and visibility of the flash indicator.
*/
private void syncFlashIndicator() {
ButtonManager buttonManager = mController.getButtonManager();
// 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 = mController.getCurrentModuleIndex();
if (modeIndex == mController.getAndroidContext().getResources()
.getInteger(R.integer.camera_mode_video)) {
setIndicatorState(mController.getCameraScope(),
Keys.KEY_VIDEOCAMERA_FLASH_MODE, mFlashIndicator,
mFlashIndicatorVideoIcons, false);
} else if (modeIndex == mController.getAndroidContext().getResources()
.getInteger(R.integer.camera_mode_gcam)) {
setIndicatorState(mController.getCameraScope(),
Keys.KEY_HDR_PLUS_FLASH_MODE, mFlashIndicator,
mFlashIndicatorPhotoIcons, false);
} else {
setIndicatorState(mController.getCameraScope(),
Keys.KEY_FLASH_MODE, mFlashIndicator,
mFlashIndicatorPhotoIcons, false);
}
} else {
changeVisibility(mFlashIndicator, View.GONE);
}
}
/**
* Sync the icon and the visibility of the hdr/hdrplus indicator.
*/
private void syncHdrIndicator() {
ButtonManager buttonManager = mController.getButtonManager();
// If hdr isn't an enabled and visible option,
// do not show the indicator.
if (buttonManager.isEnabled(ButtonManager.BUTTON_HDR_PLUS)
&& buttonManager.isVisible(ButtonManager.BUTTON_HDR_PLUS)) {
setIndicatorState(SettingsManager.SCOPE_GLOBAL,
Keys.KEY_CAMERA_HDR_PLUS, mHdrIndicator,
mHdrPlusIndicatorIcons, false);
} else if (buttonManager.isEnabled(ButtonManager.BUTTON_HDR)
&& buttonManager.isVisible(ButtonManager.BUTTON_HDR)) {
setIndicatorState(SettingsManager.SCOPE_GLOBAL,
Keys.KEY_CAMERA_HDR, mHdrIndicator,
mHdrIndicatorIcons, false);
} else {
changeVisibility(mHdrIndicator, View.GONE);
}
}
/**
* Sync the icon and the visibility of the pano indicator.
*/
private void syncPanoIndicator() {
if (mPanoIndicator == null) {
Log.w(TAG, "Trying to sync a pano indicator that is not initialized.");
return;
}
ButtonManager buttonManager = mController.getButtonManager();
if (buttonManager.isPanoEnabled()) {
setIndicatorState(SettingsManager.SCOPE_GLOBAL,
Keys.KEY_CAMERA_PANO_ORIENTATION, mPanoIndicator,
mPanoIndicatorIcons, true);
} else {
changeVisibility(mPanoIndicator, View.GONE);
}
}
private void syncExposureIndicator() {
if (mExposureIndicatorN2 == null
|| mExposureIndicatorN1 == null
|| mExposureIndicatorP1 == null
|| mExposureIndicatorP2 == null) {
Log.w(TAG, "Trying to sync exposure indicators that are not initialized.");
return;
}
// Reset all exposure indicator icons.
changeVisibility(mExposureIndicatorN2, View.GONE);
changeVisibility(mExposureIndicatorN1, View.GONE);
changeVisibility(mExposureIndicatorP1, View.GONE);
changeVisibility(mExposureIndicatorP2, View.GONE);
ButtonManager buttonManager = mController.getButtonManager();
if (buttonManager.isEnabled(ButtonManager.BUTTON_EXPOSURE_COMPENSATION)
&& buttonManager.isVisible(ButtonManager.BUTTON_EXPOSURE_COMPENSATION)) {
int compValue = mController.getSettingsManager().getInteger(
mController.getCameraScope(), Keys.KEY_EXPOSURE);
int comp = Math.round(compValue * buttonManager.getExposureCompensationStep());
// Turn on the appropriate indicator.
switch (comp) {
case -2:
changeVisibility(mExposureIndicatorN2, View.VISIBLE);
break;
case -1:
changeVisibility(mExposureIndicatorN1, View.VISIBLE);
break;
case 0:
// Do nothing.
break;
case 1:
changeVisibility(mExposureIndicatorP1, View.VISIBLE);
break;
case 2:
changeVisibility(mExposureIndicatorP2, View.VISIBLE);
}
}
}
private void syncCountdownTimerIndicator() {
ButtonManager buttonManager = mController.getButtonManager();
if (buttonManager.isEnabled(ButtonManager.BUTTON_COUNTDOWN)
&& buttonManager.isVisible(ButtonManager.BUTTON_COUNTDOWN)) {
setIndicatorState(SettingsManager.SCOPE_GLOBAL,
Keys.KEY_COUNTDOWN_DURATION, mCountdownTimerIndicator,
mCountdownTimerIndicatorIcons, false);
} else {
changeVisibility(mCountdownTimerIndicator, View.GONE);
}
}
/**
* Sets the image resource and visibility of the indicator
* based on the indicator's corresponding setting state.
*/
private void setIndicatorState(String scope, String key, ImageView imageView,
TypedArray iconArray, boolean showDefault) {
SettingsManager settingsManager = mController.getSettingsManager();
int valueIndex = settingsManager.getIndexOfCurrentValue(scope, key);
if (valueIndex < 0) {
// This can happen when the setting is camera dependent
// and the camera is not yet open. CameraAppUI.onChangeCamera()
// will call this again when the camera is open.
Log.w(TAG, "The setting for this indicator is not available.");
imageView.setVisibility(View.GONE);
return;
}
Drawable drawable = iconArray.getDrawable(valueIndex);
if (drawable == null) {
throw new IllegalStateException("Indicator drawable is null.");
}
imageView.setImageDrawable(drawable);
// Set the indicator visible if not in default state.
boolean visibilityChanged = false;
if (!showDefault && settingsManager.isDefault(scope, key)) {
changeVisibility(imageView, View.GONE);
} else {
changeVisibility(imageView, View.VISIBLE);
}
}
@Override
public void onSettingChanged(SettingsManager settingsManager, String key) {
if (key.equals(Keys.KEY_FLASH_MODE)) {
syncFlashIndicator();
return;
}
if (key.equals(Keys.KEY_VIDEOCAMERA_FLASH_MODE)) {
syncFlashIndicator();
return;
}
if (key.equals(Keys.KEY_CAMERA_HDR_PLUS)) {
syncHdrIndicator();
return;
}
if (key.equals(Keys.KEY_CAMERA_HDR)) {
syncHdrIndicator();
return;
}
if (key.equals(Keys.KEY_CAMERA_PANO_ORIENTATION)) {
syncPanoIndicator();
return;
}
if (key.equals(Keys.KEY_EXPOSURE)) {
syncExposureIndicator();
return;
}
if (key.equals(Keys.KEY_COUNTDOWN_DURATION)) {
syncCountdownTimerIndicator();
return;
}
}
}