blob: b79baa55d78d3ce94f047f9dc6126975ccbcc150 [file] [log] [blame]
/*
* Copyright (C) 2011 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;
import com.android.camera.ui.PopupManager;
import com.android.camera.ui.Rotatable;
import com.android.camera.ui.RotateImageView;
import android.content.Context;
import android.graphics.PorterDuff;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.Animation.AnimationListener;
import android.view.animation.AnimationUtils;
import android.widget.ImageView;
import android.widget.RelativeLayout;
/**
* A widget that includes three mode selections {@code RotateImageView}'s and
* a current mode indicator.
*/
public class ModePicker extends RelativeLayout implements View.OnClickListener,
PopupManager.OnOtherPopupShowedListener, Rotatable {
public static final int MODE_CAMERA = 0;
public static final int MODE_VIDEO = 1;
public static final int MODE_PANORAMA = 2;
private static final String TAG = "ModePicker";
// Total mode number
private static final int MODE_NUM = 3;
/** A callback to be called when the user wants to switch activity. */
public interface OnModeChangeListener {
// Returns true if the listener agrees that the mode can be changed.
public boolean onModeChanged(int newMode);
}
private final int DISABLED_COLOR;
private final int CURRENT_MODE_BACKGROUND;
private OnModeChangeListener mListener;
private View mModeSelectionFrame;
private RotateImageView mModeSelectionIcon[];
private View mCurrentModeFrame;
private RotateImageView mCurrentModeIcon[];
private View mCurrentModeBar;
private boolean mSelectionEnabled;
private int mCurrentMode = 0;
private Animation mFadeIn, mFadeOut;
public ModePicker(Context context, AttributeSet attrs) {
super(context, attrs);
DISABLED_COLOR = context.getResources().getColor(R.color.icon_disabled_color);
CURRENT_MODE_BACKGROUND = R.drawable.btn_mode_background;
mFadeIn = AnimationUtils.loadAnimation(
context, R.anim.mode_selection_fade_in);
mFadeOut = AnimationUtils.loadAnimation(
context, R.anim.mode_selection_fade_out);
mFadeOut.setAnimationListener(mAnimationListener);
PopupManager.getInstance(context).setOnOtherPopupShowedListener(this);
}
protected void onFinishInflate() {
super.onFinishInflate();
mModeSelectionFrame = findViewById(R.id.mode_selection);
mModeSelectionIcon = new RotateImageView[MODE_NUM];
mModeSelectionIcon[MODE_PANORAMA] =
(RotateImageView) findViewById(R.id.mode_panorama);
mModeSelectionIcon[MODE_VIDEO] =
(RotateImageView) findViewById(R.id.mode_video);
mModeSelectionIcon[MODE_CAMERA] =
(RotateImageView) findViewById(R.id.mode_camera);
// The current mode frame is for Phone UI only.
mCurrentModeFrame = findViewById(R.id.current_mode);
if (mCurrentModeFrame != null) {
mCurrentModeIcon = new RotateImageView[MODE_NUM];
mCurrentModeIcon[0] = (RotateImageView) findViewById(R.id.mode_0);
mCurrentModeIcon[1] = (RotateImageView) findViewById(R.id.mode_1);
mCurrentModeIcon[2] = (RotateImageView) findViewById(R.id.mode_2);
} else {
// current_mode_bar is only for tablet.
mCurrentModeBar = findViewById(R.id.current_mode_bar);
enableModeSelection(true);
}
registerOnClickListener();
}
private void registerOnClickListener() {
if (mCurrentModeFrame != null) {
mCurrentModeFrame.setOnClickListener(this);
}
for (int i = 0; i < MODE_NUM; ++i) {
mModeSelectionIcon[i].setOnClickListener(this);
}
}
@Override
public void onOtherPopupShowed() {
if (mSelectionEnabled) enableModeSelection(false);
}
private AnimationListener mAnimationListener = new AnimationListener() {
public void onAnimationEnd(Animation animation) {
changeToSelectedMode();
mCurrentModeFrame.setVisibility(View.VISIBLE);
mModeSelectionFrame.setVisibility(View.GONE);
}
public void onAnimationRepeat(Animation animation) {
}
public void onAnimationStart(Animation animation) {
}
};
private void enableModeSelection(boolean enabled) {
if (mCurrentModeFrame != null) {
mSelectionEnabled = enabled;
// Animation Effect is applied on Phone UI only.
mModeSelectionFrame.startAnimation(enabled ? mFadeIn : mFadeOut);
if (enabled) {
mModeSelectionFrame.setVisibility(View.VISIBLE);
mCurrentModeFrame.setVisibility(View.GONE);
}
}
updateModeState();
}
private void changeToSelectedMode() {
if (mListener != null) {
if (mListener.onModeChanged(mCurrentMode)) {
Log.e(TAG, "failed:onModeChanged:" + mCurrentMode);
}
}
}
public void onClick(View view) {
if (view == mCurrentModeFrame) {
PopupManager.getInstance(getContext()).notifyShowPopup(this);
enableModeSelection(true);
} else {
// Set the selected mode as the current one and switch to it.
for (int i = 0; i < MODE_NUM; ++i) {
if (view == mModeSelectionIcon[i] && (mCurrentMode != i)) {
setCurrentMode(i);
break;
}
}
if (mCurrentModeBar == null) {
enableModeSelection(false);
} else {
changeToSelectedMode();
}
}
}
public void setOnModeChangeListener(OnModeChangeListener listener) {
mListener = listener;
}
public void setCurrentMode(int mode) {
mCurrentMode = mode;
updateModeState();
}
public boolean onModeChanged(int mode) {
setCurrentMode(mode);
return true;
}
public void setOrientation(int orientation) {
for (int i = 0; i < MODE_NUM; ++i) {
mModeSelectionIcon[i].setOrientation(orientation);
if (mCurrentModeFrame != null) {
mCurrentModeIcon[i].setOrientation(orientation);
}
}
}
@Override
public void setEnabled(boolean enabled) {
super.setEnabled(enabled);
// Enable or disable the frames.
if (mCurrentModeFrame != null) mCurrentModeFrame.setEnabled(enabled);
mModeSelectionFrame.setEnabled(enabled);
// Enable or disable the icons.
for (int i = 0; i < MODE_NUM; ++i) {
mModeSelectionIcon[i].setEnabled(enabled);
if (mCurrentModeFrame != null) mCurrentModeIcon[i].setEnabled(enabled);
}
if (enabled) updateModeState();
}
private void highlightView(ImageView view, boolean enabled) {
if (enabled) {
view.clearColorFilter();
} else {
view.setColorFilter(DISABLED_COLOR, PorterDuff.Mode.SRC_ATOP);
}
}
private void updateModeState() {
// Grey-out the unselected icons for Phone UI.
if (mCurrentModeFrame != null) {
for (int i = 0; i < MODE_NUM; ++i) {
highlightView(mModeSelectionIcon[i], (i == mCurrentMode));
}
}
// Update the current mode icons on the Phone UI. The selected mode
// should be in the center of the current mode icon bar.
if (mCurrentModeFrame != null) {
for (int i = 0, j = 0; i < MODE_NUM; ++i) {
int target;
if (i == 1) {
// The second icon is always the selected mode.
target = mCurrentMode;
} else {
// Set the icons in order of camera, video and panorama.
if (j == mCurrentMode) j++;
target = j++;
}
mCurrentModeIcon[i].setImageDrawable(
mModeSelectionIcon[target].getDrawable());
}
}
}
@Override
protected void onLayout(
boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
// Layout the current mode indicator bar.
if (mCurrentModeBar != null) {
int viewWidth = mModeSelectionIcon[MODE_CAMERA].getWidth();
int iconWidth = ((ImageView) mModeSelectionIcon[MODE_CAMERA])
.getDrawable().getIntrinsicWidth();
int padding = (viewWidth - iconWidth) / 2;
int l = mModeSelectionFrame.getLeft() + mCurrentMode * viewWidth;
mCurrentModeBar.layout((l + padding),
(bottom - top - mCurrentModeBar.getHeight()),
(l + padding + iconWidth),
(bottom - top));
}
}
}