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