1039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li/*
2039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li * Copyright (C) 2011 The Android Open Source Project
3039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li *
4039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li * Licensed under the Apache License, Version 2.0 (the "License");
5039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li * you may not use this file except in compliance with the License.
6039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li * You may obtain a copy of the License at
7039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li *
8039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li *      http://www.apache.org/licenses/LICENSE-2.0
9039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li *
10039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li * Unless required by applicable law or agreed to in writing, software
11039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li * distributed under the License is distributed on an "AS IS" BASIS,
12039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li * See the License for the specific language governing permissions and
14039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li * limitations under the License.
15039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li */
16039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li
17039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Lipackage com.android.camera.ui;
18039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li
19039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Liimport com.android.camera.R;
20039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li
21039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Liimport android.content.Context;
220341c03529f04351534a15d06facb096aab7a95fWu-cheng Liimport android.os.Handler;
230341c03529f04351534a15d06facb096aab7a95fWu-cheng Liimport android.os.Message;
24039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Liimport android.view.MotionEvent;
25039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Liimport android.view.View;
26039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Liimport android.view.animation.Animation;
27039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Liimport android.view.animation.AnimationUtils;
28c926b2152b7d1b65f34b58af50d0c6cdeb070123Chung-yih Wangimport android.widget.ImageView;
29039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li
30039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li// This is an indicator button and pressing it opens a popup window. Ex: flash or other settings.
315f6e354a6e2a77aa935fcefeb33a9baa67d48aafChung-yih Wangpublic abstract class AbstractIndicatorButton extends RotateImageView implements
325f6e354a6e2a77aa935fcefeb33a9baa67d48aafChung-yih Wang        PopupManager.OnOtherPopupShowedListener {
33039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li    private final String TAG = "AbstractIndicatorButton";
34039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li    protected Animation mFadeIn, mFadeOut;
35039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li    protected final int HIGHLIGHT_COLOR;
36039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li    protected AbstractSettingPopup mPopup;
370341c03529f04351534a15d06facb096aab7a95fWu-cheng Li    protected Handler mHandler = new MainHandler();
380341c03529f04351534a15d06facb096aab7a95fWu-cheng Li    private final int MSG_DISMISS_POPUP = 0;
395f6e354a6e2a77aa935fcefeb33a9baa67d48aafChung-yih Wang    private IndicatorChangeListener mListener;
40842f11c8716bc6320b1b7c228742c0dd1cab2d0bChung-yih Wang
415f6e354a6e2a77aa935fcefeb33a9baa67d48aafChung-yih Wang    public static interface IndicatorChangeListener {
425f6e354a6e2a77aa935fcefeb33a9baa67d48aafChung-yih Wang        public void onShowIndicator(View view, boolean showed);
43842f11c8716bc6320b1b7c228742c0dd1cab2d0bChung-yih Wang    }
44039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li
45039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li    public AbstractIndicatorButton(Context context) {
46039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li        super(context);
47006baced4746ddaf31fbd170bcb76abc5f1f8325Chung-yih Wang        mFadeIn = AnimationUtils.loadAnimation(context, R.anim.setting_popup_grow_fade_in);
48006baced4746ddaf31fbd170bcb76abc5f1f8325Chung-yih Wang        mFadeOut = AnimationUtils.loadAnimation(context, R.anim.setting_popup_shrink_fade_out);
495f6e354a6e2a77aa935fcefeb33a9baa67d48aafChung-yih Wang        HIGHLIGHT_COLOR = context.getResources().getColor(R.color.review_control_pressed_color);
50b5c569214281e11dc7e8ffc313fbb27e5ff6e5c5Chung-yih Wang        setScaleType(ImageView.ScaleType.CENTER);
515f6e354a6e2a77aa935fcefeb33a9baa67d48aafChung-yih Wang        PopupManager.getInstance(context).setOnOtherPopupShowedListener(this);
5226d88fce15a24362644123af5f0cce79ea572e7bChung-yih Wang        // Set the click listener to help the comprehension of the accessibility.
5326d88fce15a24362644123af5f0cce79ea572e7bChung-yih Wang        setClickable(true);
545f6e354a6e2a77aa935fcefeb33a9baa67d48aafChung-yih Wang    }
555f6e354a6e2a77aa935fcefeb33a9baa67d48aafChung-yih Wang
565f6e354a6e2a77aa935fcefeb33a9baa67d48aafChung-yih Wang    @Override
575f6e354a6e2a77aa935fcefeb33a9baa67d48aafChung-yih Wang    public void onOtherPopupShowed() {
585f6e354a6e2a77aa935fcefeb33a9baa67d48aafChung-yih Wang        dismissPopup();
59039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li    }
60039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li
615f6e354a6e2a77aa935fcefeb33a9baa67d48aafChung-yih Wang    public void setIndicatorChangeListener(IndicatorChangeListener listener) {
62842f11c8716bc6320b1b7c228742c0dd1cab2d0bChung-yih Wang        mListener = listener;
63842f11c8716bc6320b1b7c228742c0dd1cab2d0bChung-yih Wang    }
64842f11c8716bc6320b1b7c228742c0dd1cab2d0bChung-yih Wang
65039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li    // Whether scene mode affects this indicator and it cannot be changed.
66039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li    public boolean isOverridden() {
67039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li        return false;
68039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li    }
69039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li
70039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li    // Scene mode may override other settings like flash, white-balance, and focus.
71039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li    abstract public void overrideSettings(final String ... keyvalues);
72039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li
73039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li    @Override
74039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li    public boolean onTouchEvent(MotionEvent ev) {
75c6bf6547259e75a4fc0e3ac61ab589f456031837Wu-cheng Li        if (!isEnabled()) return false;
76c6bf6547259e75a4fc0e3ac61ab589f456031837Wu-cheng Li
77039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li        int action = ev.getAction();
78039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li        if (action == MotionEvent.ACTION_DOWN && !isOverridden()) {
79039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li            if (mPopup == null || mPopup.getVisibility() != View.VISIBLE) {
80039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li                showPopup();
815f6e354a6e2a77aa935fcefeb33a9baa67d48aafChung-yih Wang                PopupManager.getInstance(getContext()).notifyShowPopup(this);
82039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li            } else {
83039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li                dismissPopup();
84039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li            }
85039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li            return true;
86039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li        } else if (action == MotionEvent.ACTION_CANCEL) {
87039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li            dismissPopup();
88039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li            return true;
89039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li        }
90039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li        return false;
91039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li    }
92039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li
93039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li    @Override
94039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li    public void setEnabled(boolean enabled) {
95039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li        // Do not enable the button if it is overridden by scene mode.
96039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li        if (isOverridden()) {
97039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li            enabled = false;
98039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li        }
99039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li
100039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li        // Don't do anything if state is not changed so not to interfere with
101039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li        // the "highlight" state.
102039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li        if (isEnabled() ^ enabled) {
103039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li            super.setEnabled(enabled);
104039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li        }
105039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li    }
106039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li
107cead50ba3ce2df3bd9fcf06c6f54ea0c6980f0d7repo sync    @Override
1083ebe49d8f1b4defb7cfd4850a14e795aada2ebd1Chih-yu Huang    public void setOrientation(int orientation) {
1093ebe49d8f1b4defb7cfd4850a14e795aada2ebd1Chih-yu Huang        super.setOrientation(orientation);
110bed7386688cd7810cba23732ab71f370fe3222ffChung-yih Wang        if (mPopup != null) {
1113ebe49d8f1b4defb7cfd4850a14e795aada2ebd1Chih-yu Huang            mPopup.setOrientation(orientation);
112bed7386688cd7810cba23732ab71f370fe3222ffChung-yih Wang        }
113cead50ba3ce2df3bd9fcf06c6f54ea0c6980f0d7repo sync    }
114cead50ba3ce2df3bd9fcf06c6f54ea0c6980f0d7repo sync
115039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li    abstract protected void initializePopup();
116039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li
117039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li    private void showPopup() {
1184b9791ff6763d310c750892b774119ad750c512aChih-yu Huang        setPressed(true);
1190341c03529f04351534a15d06facb096aab7a95fWu-cheng Li        mHandler.removeMessages(MSG_DISMISS_POPUP);
120039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li        if (mPopup == null) initializePopup();
121039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li
122bed7386688cd7810cba23732ab71f370fe3222ffChung-yih Wang        mPopup.setVisibility(View.VISIBLE);
123bed7386688cd7810cba23732ab71f370fe3222ffChung-yih Wang        mPopup.setOrientation(getDegree());
124039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li        mPopup.clearAnimation();
125039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li        mPopup.startAnimation(mFadeIn);
1265f6e354a6e2a77aa935fcefeb33a9baa67d48aafChung-yih Wang        if (mListener != null) mListener.onShowIndicator(this, true);
127039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li    }
128039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li
129039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li    public boolean dismissPopup() {
1304b9791ff6763d310c750892b774119ad750c512aChih-yu Huang        setPressed(false);
1310341c03529f04351534a15d06facb096aab7a95fWu-cheng Li        mHandler.removeMessages(MSG_DISMISS_POPUP);
132039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li        if (mPopup != null && mPopup.getVisibility() == View.VISIBLE) {
133039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li            mPopup.clearAnimation();
134039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li            mPopup.startAnimation(mFadeOut);
135e46d09dc17ac1cad5062fdc4b29916dc63da06c3Chung-yih Wang            mPopup.setVisibility(View.GONE);
1365f6e354a6e2a77aa935fcefeb33a9baa67d48aafChung-yih Wang            if (mListener != null) mListener.onShowIndicator(this, false);
137039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li            invalidate();
1380341c03529f04351534a15d06facb096aab7a95fWu-cheng Li            // Indicator wheel needs to update the highlight indicator if this
1390341c03529f04351534a15d06facb096aab7a95fWu-cheng Li            // is dismissed by MSG_DISMISS_POPUP.
1400341c03529f04351534a15d06facb096aab7a95fWu-cheng Li            ((View) getParent()).invalidate();
141039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li            return true;
142039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li        }
143039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li        return false;
144039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li    }
145039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li
146039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li    public AbstractSettingPopup getPopupWindow() {
147039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li        if (mPopup != null && mPopup.getVisibility() == View.VISIBLE) {
148039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li            return mPopup;
149039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li        } else {
150039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li            return null;
151039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li        }
152039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li    }
153039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li
1544cc009b812557bc312af556e3ed64cae2367d69eChung-yih Wang    public void reloadPreference() {
155039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li        if (mPopup != null) mPopup.reloadPreference();
156039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li    }
1570341c03529f04351534a15d06facb096aab7a95fWu-cheng Li
1580341c03529f04351534a15d06facb096aab7a95fWu-cheng Li    protected void dismissPopupDelayed() {
1590341c03529f04351534a15d06facb096aab7a95fWu-cheng Li        if (!mHandler.hasMessages(MSG_DISMISS_POPUP)) {
1600341c03529f04351534a15d06facb096aab7a95fWu-cheng Li            mHandler.sendEmptyMessage(MSG_DISMISS_POPUP);
1610341c03529f04351534a15d06facb096aab7a95fWu-cheng Li        }
1620341c03529f04351534a15d06facb096aab7a95fWu-cheng Li    }
1630341c03529f04351534a15d06facb096aab7a95fWu-cheng Li
1640341c03529f04351534a15d06facb096aab7a95fWu-cheng Li    private class MainHandler extends Handler {
1650341c03529f04351534a15d06facb096aab7a95fWu-cheng Li        @Override
1660341c03529f04351534a15d06facb096aab7a95fWu-cheng Li        public void handleMessage(Message msg) {
1670341c03529f04351534a15d06facb096aab7a95fWu-cheng Li            switch (msg.what) {
1680341c03529f04351534a15d06facb096aab7a95fWu-cheng Li                case MSG_DISMISS_POPUP:
1690341c03529f04351534a15d06facb096aab7a95fWu-cheng Li                    dismissPopup();
1700341c03529f04351534a15d06facb096aab7a95fWu-cheng Li                    break;
1710341c03529f04351534a15d06facb096aab7a95fWu-cheng Li            }
1720341c03529f04351534a15d06facb096aab7a95fWu-cheng Li        }
1730341c03529f04351534a15d06facb096aab7a95fWu-cheng Li    }
174039f1dc1fd89b5baeed8be05f3f21770cf75d4b3Wu-cheng Li}
175