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