/* * 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)); } } }