IndicatorControlBar.java revision b1ce29490ec61847602ece16f3745417787d3d8f
1ec1dfcb7314d10ff243a922fe4eff66ea699dd77Owen Lin/* 2ec1dfcb7314d10ff243a922fe4eff66ea699dd77Owen Lin * Copyright (C) 2010 The Android Open Source Project 3ec1dfcb7314d10ff243a922fe4eff66ea699dd77Owen Lin * 4ec1dfcb7314d10ff243a922fe4eff66ea699dd77Owen Lin * Licensed under the Apache License, Version 2.0 (the "License"); 5ec1dfcb7314d10ff243a922fe4eff66ea699dd77Owen Lin * you may not use this file except in compliance with the License. 6ec1dfcb7314d10ff243a922fe4eff66ea699dd77Owen Lin * You may obtain a copy of the License at 7ec1dfcb7314d10ff243a922fe4eff66ea699dd77Owen Lin * 8ec1dfcb7314d10ff243a922fe4eff66ea699dd77Owen Lin * http://www.apache.org/licenses/LICENSE-2.0 9ec1dfcb7314d10ff243a922fe4eff66ea699dd77Owen Lin * 10ec1dfcb7314d10ff243a922fe4eff66ea699dd77Owen Lin * Unless required by applicable law or agreed to in writing, software 11ec1dfcb7314d10ff243a922fe4eff66ea699dd77Owen Lin * distributed under the License is distributed on an "AS IS" BASIS, 12ec1dfcb7314d10ff243a922fe4eff66ea699dd77Owen Lin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ec1dfcb7314d10ff243a922fe4eff66ea699dd77Owen Lin * See the License for the specific language governing permissions and 14ec1dfcb7314d10ff243a922fe4eff66ea699dd77Owen Lin * limitations under the License. 15ec1dfcb7314d10ff243a922fe4eff66ea699dd77Owen Lin */ 16ec1dfcb7314d10ff243a922fe4eff66ea699dd77Owen Lin 174de149ceb47f2c251f646419907424bfb67d2b64Owen Linpackage com.android.camera.ui; 184de149ceb47f2c251f646419907424bfb67d2b64Owen Lin 19adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wangimport com.android.camera.PreferenceGroup; 20adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wangimport com.android.camera.R; 21adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang 22bed7386688cd7810cba23732ab71f370fe3222ffChung-yih Wangimport android.content.Context; 23bed7386688cd7810cba23732ab71f370fe3222ffChung-yih Wangimport android.util.AttributeSet; 24ab2ffa88872149978823c3184d0af162d3cdca13Chung-yih Wangimport android.view.MotionEvent; 25adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wangimport android.view.View; 26adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wangimport android.widget.ImageView; 274de149ceb47f2c251f646419907424bfb67d2b64Owen Lin 28bed7386688cd7810cba23732ab71f370fe3222ffChung-yih Wang/** 29adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang * A view that contains the top-level indicator control. 30bed7386688cd7810cba23732ab71f370fe3222ffChung-yih Wang */ 31ff45331706e2fe361b4ff736d90b0ad4af0e7be9Chung-yih Wangpublic class IndicatorControlBar extends IndicatorControl implements 32ab2ffa88872149978823c3184d0af162d3cdca13Chung-yih Wang View.OnClickListener, View.OnTouchListener { 33ff45331706e2fe361b4ff736d90b0ad4af0e7be9Chung-yih Wang private static final String TAG = "IndicatorControlBar"; 34adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang 35adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang private ImageView mZoomIcon; 36adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang private ImageView mSecondLevelIcon; 374de149ceb47f2c251f646419907424bfb67d2b64Owen Lin 38ff45331706e2fe361b4ff736d90b0ad4af0e7be9Chung-yih Wang public IndicatorControlBar(Context context, AttributeSet attrs) { 39bed7386688cd7810cba23732ab71f370fe3222ffChung-yih Wang super(context, attrs); 404de149ceb47f2c251f646419907424bfb67d2b64Owen Lin } 414de149ceb47f2c251f646419907424bfb67d2b64Owen Lin 42adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang public void initialize(Context context, PreferenceGroup group, 43adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang String flashSetting, boolean zoomSupported) { 44adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang // From UI spec, we have camera_flash setting on the first level. 45ab2ffa88872149978823c3184d0af162d3cdca13Chung-yih Wang setPreferenceGroup(group); 46ab2ffa88872149978823c3184d0af162d3cdca13Chung-yih Wang addControls(new String[] {flashSetting}, null); 47bed7386688cd7810cba23732ab71f370fe3222ffChung-yih Wang 4895788ace8ad3630312f2f94544690c448c935f9eChung-yih Wang // Add CameraPicker control. 49ed6373cd34393dfdda8d18a03705c83bfff1f535Chung-yih Wang initializeCameraPicker(); 5095788ace8ad3630312f2f94544690c448c935f9eChung-yih Wang 51adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang // add Zoom Icon. 52adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang if (zoomSupported) { 53adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang mZoomIcon = (ImageView) findViewById(R.id.zoom_control_icon); 54ab2ffa88872149978823c3184d0af162d3cdca13Chung-yih Wang mZoomIcon.setOnTouchListener(this); 55adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang mZoomIcon.setVisibility(View.VISIBLE); 56adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang } 57bed7386688cd7810cba23732ab71f370fe3222ffChung-yih Wang 58adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang mSecondLevelIcon = (ImageView) findViewById(R.id.second_level_indicator_bar_icon); 59adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang mSecondLevelIcon.setOnClickListener(this); 60adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang requestLayout(); 61adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang } 62bed7386688cd7810cba23732ab71f370fe3222ffChung-yih Wang 63d2202f9677fcc5f3f2b3e950c35aefe80da14a8aChung-yih Wang @Override 64d2202f9677fcc5f3f2b3e950c35aefe80da14a8aChung-yih Wang public boolean dispatchTouchEvent(MotionEvent event) { 65d2202f9677fcc5f3f2b3e950c35aefe80da14a8aChung-yih Wang super.dispatchTouchEvent(event); 66d2202f9677fcc5f3f2b3e950c35aefe80da14a8aChung-yih Wang // We need to consume the event, or it will trigger tap-to-focus. 67d2202f9677fcc5f3f2b3e950c35aefe80da14a8aChung-yih Wang return true; 68d2202f9677fcc5f3f2b3e950c35aefe80da14a8aChung-yih Wang } 69d2202f9677fcc5f3f2b3e950c35aefe80da14a8aChung-yih Wang 70ab2ffa88872149978823c3184d0af162d3cdca13Chung-yih Wang public boolean onTouch(View v, MotionEvent event) { 71adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang dismissSettingPopup(); 72ab2ffa88872149978823c3184d0af162d3cdca13Chung-yih Wang if (event.getAction() == MotionEvent.ACTION_DOWN) { 73adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang mOnIndicatorEventListener.onIndicatorEvent( 74ab2ffa88872149978823c3184d0af162d3cdca13Chung-yih Wang OnIndicatorEventListener.EVENT_ENTER_ZOOM_CONTROL); 754de149ceb47f2c251f646419907424bfb67d2b64Owen Lin } 76d2202f9677fcc5f3f2b3e950c35aefe80da14a8aChung-yih Wang return true; 77ab2ffa88872149978823c3184d0af162d3cdca13Chung-yih Wang } 78ab2ffa88872149978823c3184d0af162d3cdca13Chung-yih Wang 79ab2ffa88872149978823c3184d0af162d3cdca13Chung-yih Wang public void onClick(View view) { 80ab2ffa88872149978823c3184d0af162d3cdca13Chung-yih Wang dismissSettingPopup(); 81ab2ffa88872149978823c3184d0af162d3cdca13Chung-yih Wang // Only for the click on mSecondLevelIcon. 82ab2ffa88872149978823c3184d0af162d3cdca13Chung-yih Wang mOnIndicatorEventListener.onIndicatorEvent( 83ab2ffa88872149978823c3184d0af162d3cdca13Chung-yih Wang OnIndicatorEventListener.EVENT_ENTER_SECOND_LEVEL_INDICATOR_BAR); 844de149ceb47f2c251f646419907424bfb67d2b64Owen Lin } 854de149ceb47f2c251f646419907424bfb67d2b64Owen Lin 864de149ceb47f2c251f646419907424bfb67d2b64Owen Lin @Override 874de149ceb47f2c251f646419907424bfb67d2b64Owen Lin protected void onLayout( 884de149ceb47f2c251f646419907424bfb67d2b64Owen Lin boolean changed, int left, int top, int right, int bottom) { 89adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang // Layout the static components. 90adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang super.onLayout(changed, left, top, right, bottom); 91adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang 92bed7386688cd7810cba23732ab71f370fe3222ffChung-yih Wang int count = getChildCount(); 93bed7386688cd7810cba23732ab71f370fe3222ffChung-yih Wang if (count == 0) return; 94bed7386688cd7810cba23732ab71f370fe3222ffChung-yih Wang int width = right - left; 9595788ace8ad3630312f2f94544690c448c935f9eChung-yih Wang int offset = 0; 9695788ace8ad3630312f2f94544690c448c935f9eChung-yih Wang 97adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang for (int i = 0 ; i < count ; i++) { 9895788ace8ad3630312f2f94544690c448c935f9eChung-yih Wang View view = getChildAt(i); 99adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang if (view instanceof IndicatorButton) { 10095788ace8ad3630312f2f94544690c448c935f9eChung-yih Wang view.layout(0, offset, width, offset + width); 10195788ace8ad3630312f2f94544690c448c935f9eChung-yih Wang offset += width; 102adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang } 1034de149ceb47f2c251f646419907424bfb67d2b64Owen Lin } 10495788ace8ad3630312f2f94544690c448c935f9eChung-yih Wang if (mCameraPicker != null) mCameraPicker.layout(0, offset, width, offset + width); 105f5876dbd29607a0e9762f88e9db6fa35ffb20067Owen Lin } 106b1ce29490ec61847602ece16f3745417787d3d8fChung-yih Wang 107b1ce29490ec61847602ece16f3745417787d3d8fChung-yih Wang @Override 108b1ce29490ec61847602ece16f3745417787d3d8fChung-yih Wang public void setEnabled(boolean enabled) { 109b1ce29490ec61847602ece16f3745417787d3d8fChung-yih Wang super.setEnabled(enabled); 110b1ce29490ec61847602ece16f3745417787d3d8fChung-yih Wang if (mCurrentMode == MODE_VIDEO) { 111b1ce29490ec61847602ece16f3745417787d3d8fChung-yih Wang mSecondLevelIcon.setVisibility(enabled ? View.VISIBLE : View.INVISIBLE); 112b1ce29490ec61847602ece16f3745417787d3d8fChung-yih Wang } else { 113b1ce29490ec61847602ece16f3745417787d3d8fChung-yih Wang // We also disable the zoom button during snapshot. 114b1ce29490ec61847602ece16f3745417787d3d8fChung-yih Wang if (mZoomIcon != null) mZoomIcon.setEnabled(enabled); 115b1ce29490ec61847602ece16f3745417787d3d8fChung-yih Wang } 116b1ce29490ec61847602ece16f3745417787d3d8fChung-yih Wang mSecondLevelIcon.setEnabled(enabled); 117b1ce29490ec61847602ece16f3745417787d3d8fChung-yih Wang } 1184de149ceb47f2c251f646419907424bfb67d2b64Owen Lin} 119