blob: fd0f66498ec88360324fe3eb21d68d8619d38f45 [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.ui;
import com.android.camera.R;
import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.view.MotionEvent;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.ImageView;
// This is an indicator button and pressing it opens a popup window. Ex: flash or other settings.
public abstract class AbstractIndicatorButton extends RotateImageView implements
PopupManager.OnOtherPopupShowedListener {
private final String TAG = "AbstractIndicatorButton";
protected Animation mFadeIn, mFadeOut;
protected final int HIGHLIGHT_COLOR;
protected AbstractSettingPopup mPopup;
protected Handler mHandler = new MainHandler();
private final int MSG_DISMISS_POPUP = 0;
private IndicatorChangeListener mListener;
public static interface IndicatorChangeListener {
public void onShowIndicator(View view, boolean showed);
}
public AbstractIndicatorButton(Context context) {
super(context);
mFadeIn = AnimationUtils.loadAnimation(context, R.anim.setting_popup_grow_fade_in);
mFadeOut = AnimationUtils.loadAnimation(context, R.anim.setting_popup_shrink_fade_out);
HIGHLIGHT_COLOR = context.getResources().getColor(R.color.review_control_pressed_color);
setScaleType(ImageView.ScaleType.CENTER);
PopupManager.getInstance(context).setOnOtherPopupShowedListener(this);
// Set the click listener to help the comprehension of the accessibility.
setClickable(true);
}
@Override
public void onOtherPopupShowed() {
dismissPopup();
}
public void setIndicatorChangeListener(IndicatorChangeListener listener) {
mListener = listener;
}
// Whether scene mode affects this indicator and it cannot be changed.
public boolean isOverridden() {
return false;
}
// Scene mode may override other settings like flash, white-balance, and focus.
abstract public void overrideSettings(final String ... keyvalues);
@Override
public boolean onTouchEvent(MotionEvent ev) {
if (!isEnabled()) return false;
int action = ev.getAction();
if (action == MotionEvent.ACTION_DOWN && !isOverridden()) {
if (mPopup == null || mPopup.getVisibility() != View.VISIBLE) {
showPopup();
PopupManager.getInstance(getContext()).notifyShowPopup(this);
} else {
dismissPopup();
}
return true;
} else if (action == MotionEvent.ACTION_CANCEL) {
dismissPopup();
return true;
}
return false;
}
@Override
public void setEnabled(boolean enabled) {
// Do not enable the button if it is overridden by scene mode.
if (isOverridden()) {
enabled = false;
}
// Don't do anything if state is not changed so not to interfere with
// the "highlight" state.
if (isEnabled() ^ enabled) {
super.setEnabled(enabled);
}
}
@Override
public void setOrientation(int orientation) {
super.setOrientation(orientation);
if (mPopup != null) {
mPopup.setOrientation(orientation);
}
}
abstract protected void initializePopup();
private void showPopup() {
setPressed(true);
mHandler.removeMessages(MSG_DISMISS_POPUP);
if (mPopup == null) initializePopup();
mPopup.setVisibility(View.VISIBLE);
mPopup.setOrientation(getDegree());
mPopup.clearAnimation();
mPopup.startAnimation(mFadeIn);
if (mListener != null) mListener.onShowIndicator(this, true);
}
public boolean dismissPopup() {
setPressed(false);
mHandler.removeMessages(MSG_DISMISS_POPUP);
if (mPopup != null && mPopup.getVisibility() == View.VISIBLE) {
mPopup.clearAnimation();
mPopup.startAnimation(mFadeOut);
mPopup.setVisibility(View.GONE);
if (mListener != null) mListener.onShowIndicator(this, false);
invalidate();
// Indicator wheel needs to update the highlight indicator if this
// is dismissed by MSG_DISMISS_POPUP.
((View) getParent()).invalidate();
return true;
}
return false;
}
public AbstractSettingPopup getPopupWindow() {
if (mPopup != null && mPopup.getVisibility() == View.VISIBLE) {
return mPopup;
} else {
return null;
}
}
public void reloadPreference() {
if (mPopup != null) mPopup.reloadPreference();
}
protected void dismissPopupDelayed() {
if (!mHandler.hasMessages(MSG_DISMISS_POPUP)) {
mHandler.sendEmptyMessage(MSG_DISMISS_POPUP);
}
}
private class MainHandler extends Handler {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_DISMISS_POPUP:
dismissPopup();
break;
}
}
}
}