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; 216b3f2ff14ca0a0d694d5af13e4d5a392c8552191Chung-yih Wangimport com.android.camera.Util; 22adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang 23bed7386688cd7810cba23732ab71f370fe3222ffChung-yih Wangimport android.content.Context; 24bed7386688cd7810cba23732ab71f370fe3222ffChung-yih Wangimport android.util.AttributeSet; 25ab2ffa88872149978823c3184d0af162d3cdca13Chung-yih Wangimport android.view.MotionEvent; 26adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wangimport android.view.View; 27adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wangimport android.widget.ImageView; 284de149ceb47f2c251f646419907424bfb67d2b64Owen Lin 29bed7386688cd7810cba23732ab71f370fe3222ffChung-yih Wang/** 30adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang * A view that contains the top-level indicator control. 31bed7386688cd7810cba23732ab71f370fe3222ffChung-yih Wang */ 32ff45331706e2fe361b4ff736d90b0ad4af0e7be9Chung-yih Wangpublic class IndicatorControlBar extends IndicatorControl implements 33b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang View.OnClickListener { 34ff45331706e2fe361b4ff736d90b0ad4af0e7be9Chung-yih Wang private static final String TAG = "IndicatorControlBar"; 35adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang 366b3f2ff14ca0a0d694d5af13e4d5a392c8552191Chung-yih Wang // Space between indicator icons. 376b3f2ff14ca0a0d694d5af13e4d5a392c8552191Chung-yih Wang public static final int ICON_SPACING = Util.dpToPixel(16); 386b3f2ff14ca0a0d694d5af13e4d5a392c8552191Chung-yih Wang 39adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang private ImageView mZoomIcon; 40adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang private ImageView mSecondLevelIcon; 41b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang private ZoomControlBar mZoomControl; 424de149ceb47f2c251f646419907424bfb67d2b64Owen Lin 43ff45331706e2fe361b4ff736d90b0ad4af0e7be9Chung-yih Wang public IndicatorControlBar(Context context, AttributeSet attrs) { 44bed7386688cd7810cba23732ab71f370fe3222ffChung-yih Wang super(context, attrs); 454de149ceb47f2c251f646419907424bfb67d2b64Owen Lin } 464de149ceb47f2c251f646419907424bfb67d2b64Owen Lin 476176dfc23f5a092ca1b2ee3d07d7076821ec6095Chung-yih Wang @Override 486176dfc23f5a092ca1b2ee3d07d7076821ec6095Chung-yih Wang protected void onFinishInflate() { 496176dfc23f5a092ca1b2ee3d07d7076821ec6095Chung-yih Wang mSecondLevelIcon = (ImageView) 506176dfc23f5a092ca1b2ee3d07d7076821ec6095Chung-yih Wang findViewById(R.id.second_level_indicator_bar_icon); 516176dfc23f5a092ca1b2ee3d07d7076821ec6095Chung-yih Wang mSecondLevelIcon.setOnClickListener(this); 526176dfc23f5a092ca1b2ee3d07d7076821ec6095Chung-yih Wang } 536176dfc23f5a092ca1b2ee3d07d7076821ec6095Chung-yih Wang 54adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang public void initialize(Context context, PreferenceGroup group, 55b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang boolean zoomSupported) { 56ab2ffa88872149978823c3184d0af162d3cdca13Chung-yih Wang setPreferenceGroup(group); 57bed7386688cd7810cba23732ab71f370fe3222ffChung-yih Wang 5895788ace8ad3630312f2f94544690c448c935f9eChung-yih Wang // Add CameraPicker control. 59ed6373cd34393dfdda8d18a03705c83bfff1f535Chung-yih Wang initializeCameraPicker(); 6077665404048135a5a96d709378d6f55518b868e2Wu-cheng Li if (mCameraPicker != null) { 6177665404048135a5a96d709378d6f55518b868e2Wu-cheng Li mCameraPicker.setBackgroundResource(R.drawable.bg_pressed); 6277665404048135a5a96d709378d6f55518b868e2Wu-cheng Li } 6395788ace8ad3630312f2f94544690c448c935f9eChung-yih Wang 64b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang // Add the ZoomControl if supported. 65adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang if (zoomSupported) { 66b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang mZoomControl = (ZoomControlBar) findViewById(R.id.zoom_control); 67b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang mZoomControl.setVisibility(View.VISIBLE); 68adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang } 69adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang requestLayout(); 70adab2bddc93bf4af535cb58e7167bf8690d97d8cChung-yih Wang } 71bed7386688cd7810cba23732ab71f370fe3222ffChung-yih Wang 72d2202f9677fcc5f3f2b3e950c35aefe80da14a8aChung-yih Wang @Override 73d2202f9677fcc5f3f2b3e950c35aefe80da14a8aChung-yih Wang public boolean dispatchTouchEvent(MotionEvent event) { 74d2202f9677fcc5f3f2b3e950c35aefe80da14a8aChung-yih Wang super.dispatchTouchEvent(event); 75d2202f9677fcc5f3f2b3e950c35aefe80da14a8aChung-yih Wang // We need to consume the event, or it will trigger tap-to-focus. 76d2202f9677fcc5f3f2b3e950c35aefe80da14a8aChung-yih Wang return true; 77d2202f9677fcc5f3f2b3e950c35aefe80da14a8aChung-yih Wang } 78d2202f9677fcc5f3f2b3e950c35aefe80da14a8aChung-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) { 89bed7386688cd7810cba23732ab71f370fe3222ffChung-yih Wang int count = getChildCount(); 90bed7386688cd7810cba23732ab71f370fe3222ffChung-yih Wang if (count == 0) return; 914b9791ff6763d310c750892b774119ad750c512aChih-yu Huang 924b9791ff6763d310c750892b774119ad750c512aChih-yu Huang // We have (equal) paddings at left and right, but no padding at top or 934b9791ff6763d310c750892b774119ad750c512aChih-yu Huang // bottom. 944b9791ff6763d310c750892b774119ad750c512aChih-yu Huang int padding = getPaddingLeft(); 954b9791ff6763d310c750892b774119ad750c512aChih-yu Huang int width = right - left; 96d33109730e0ab81230f84e2bd35599e8e24fc4baChung-yih Wang int height = bottom - top; 97b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang 984b9791ff6763d310c750892b774119ad750c512aChih-yu Huang // We want the icons to be square (size x size) 994b9791ff6763d310c750892b774119ad750c512aChih-yu Huang int size = height; 1004b9791ff6763d310c750892b774119ad750c512aChih-yu Huang 1014b9791ff6763d310c750892b774119ad750c512aChih-yu Huang mSecondLevelIcon.layout(padding, 0, padding + size, size); 102b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang 103b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang // Layout the zoom control if required. 104b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang if (mZoomControl != null) { 1054b9791ff6763d310c750892b774119ad750c512aChih-yu Huang mZoomControl.layout(padding + size, 0, width - padding - size, size); 106b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang } 107b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang 108d33109730e0ab81230f84e2bd35599e8e24fc4baChung-yih Wang if (mCameraPicker != null) { 1094b9791ff6763d310c750892b774119ad750c512aChih-yu Huang mCameraPicker.layout(width - padding - size, 0, width - padding, size); 110d33109730e0ab81230f84e2bd35599e8e24fc4baChung-yih Wang } 111f5876dbd29607a0e9762f88e9db6fa35ffb20067Owen Lin } 112b1ce29490ec61847602ece16f3745417787d3d8fChung-yih Wang 113b1ce29490ec61847602ece16f3745417787d3d8fChung-yih Wang @Override 114b1ce29490ec61847602ece16f3745417787d3d8fChung-yih Wang public void setEnabled(boolean enabled) { 115b1ce29490ec61847602ece16f3745417787d3d8fChung-yih Wang super.setEnabled(enabled); 116b1ce29490ec61847602ece16f3745417787d3d8fChung-yih Wang if (mCurrentMode == MODE_VIDEO) { 117b1ce29490ec61847602ece16f3745417787d3d8fChung-yih Wang mSecondLevelIcon.setVisibility(enabled ? View.VISIBLE : View.INVISIBLE); 118b1ce29490ec61847602ece16f3745417787d3d8fChung-yih Wang } else { 119b1ce29490ec61847602ece16f3745417787d3d8fChung-yih Wang // We also disable the zoom button during snapshot. 1200bb4487fcc7601118111d4545c31dae04651b456Wu-cheng Li enableZoom(enabled); 121b1ce29490ec61847602ece16f3745417787d3d8fChung-yih Wang } 122b1ce29490ec61847602ece16f3745417787d3d8fChung-yih Wang mSecondLevelIcon.setEnabled(enabled); 123b1ce29490ec61847602ece16f3745417787d3d8fChung-yih Wang } 1240bb4487fcc7601118111d4545c31dae04651b456Wu-cheng Li 1250bb4487fcc7601118111d4545c31dae04651b456Wu-cheng Li public void enableZoom(boolean enabled) { 126b7d0a0704e437a1892fbf2a6e5138cf36df9fde8Chung-yih Wang if (mZoomControl != null) mZoomControl.setEnabled(enabled); 1270bb4487fcc7601118111d4545c31dae04651b456Wu-cheng Li } 1284de149ceb47f2c251f646419907424bfb67d2b64Owen Lin} 129