116ca94d73bfe07f280e381595709b56c2681b2bcWu-cheng Li/* 216ca94d73bfe07f280e381595709b56c2681b2bcWu-cheng Li * Copyright (C) 2011 The Android Open Source Project 316ca94d73bfe07f280e381595709b56c2681b2bcWu-cheng Li * 416ca94d73bfe07f280e381595709b56c2681b2bcWu-cheng Li * Licensed under the Apache License, Version 2.0 (the "License"); 516ca94d73bfe07f280e381595709b56c2681b2bcWu-cheng Li * you may not use this file except in compliance with the License. 616ca94d73bfe07f280e381595709b56c2681b2bcWu-cheng Li * You may obtain a copy of the License at 716ca94d73bfe07f280e381595709b56c2681b2bcWu-cheng Li * 816ca94d73bfe07f280e381595709b56c2681b2bcWu-cheng Li * http://www.apache.org/licenses/LICENSE-2.0 916ca94d73bfe07f280e381595709b56c2681b2bcWu-cheng Li * 1016ca94d73bfe07f280e381595709b56c2681b2bcWu-cheng Li * Unless required by applicable law or agreed to in writing, software 1116ca94d73bfe07f280e381595709b56c2681b2bcWu-cheng Li * distributed under the License is distributed on an "AS IS" BASIS, 1216ca94d73bfe07f280e381595709b56c2681b2bcWu-cheng Li * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1316ca94d73bfe07f280e381595709b56c2681b2bcWu-cheng Li * See the License for the specific language governing permissions and 1416ca94d73bfe07f280e381595709b56c2681b2bcWu-cheng Li * limitations under the License. 1516ca94d73bfe07f280e381595709b56c2681b2bcWu-cheng Li */ 1616ca94d73bfe07f280e381595709b56c2681b2bcWu-cheng Li 1716ca94d73bfe07f280e381595709b56c2681b2bcWu-cheng Lipackage com.android.camera.ui; 1816ca94d73bfe07f280e381595709b56c2681b2bcWu-cheng Li 194c7b291018e08dbb4bc1712d95117a294fa1416cWu-cheng Liimport android.app.Activity; 2016ca94d73bfe07f280e381595709b56c2681b2bcWu-cheng Liimport android.content.Context; 214c7b291018e08dbb4bc1712d95117a294fa1416cWu-cheng Liimport android.content.pm.ActivityInfo; 2216ca94d73bfe07f280e381595709b56c2681b2bcWu-cheng Liimport android.util.AttributeSet; 2316ca94d73bfe07f280e381595709b56c2681b2bcWu-cheng Liimport android.util.Log; 2416ca94d73bfe07f280e381595709b56c2681b2bcWu-cheng Liimport android.widget.RelativeLayout; 2516ca94d73bfe07f280e381595709b56c2681b2bcWu-cheng Li 2616ca94d73bfe07f280e381595709b56c2681b2bcWu-cheng Li/** 2716ca94d73bfe07f280e381595709b56c2681b2bcWu-cheng Li * A layout which handles the the width of the control panel, which contains 2816ca94d73bfe07f280e381595709b56c2681b2bcWu-cheng Li * the shutter button, thumbnail, front/back camera picker, and mode picker. 2916ca94d73bfe07f280e381595709b56c2681b2bcWu-cheng Li * The purpose of this is to have a consistent width of control panel in camera, 304c7b291018e08dbb4bc1712d95117a294fa1416cWu-cheng Li * camcorder, and panorama modes. 3116ca94d73bfe07f280e381595709b56c2681b2bcWu-cheng Li */ 3216ca94d73bfe07f280e381595709b56c2681b2bcWu-cheng Lipublic class ControlPanelLayout extends RelativeLayout { 3316ca94d73bfe07f280e381595709b56c2681b2bcWu-cheng Li private static final String TAG = "ControlPanelLayout"; 3416ca94d73bfe07f280e381595709b56c2681b2bcWu-cheng Li 3516ca94d73bfe07f280e381595709b56c2681b2bcWu-cheng Li public ControlPanelLayout(Context context, AttributeSet attrs) { 3616ca94d73bfe07f280e381595709b56c2681b2bcWu-cheng Li super(context, attrs); 3716ca94d73bfe07f280e381595709b56c2681b2bcWu-cheng Li } 3816ca94d73bfe07f280e381595709b56c2681b2bcWu-cheng Li 3916ca94d73bfe07f280e381595709b56c2681b2bcWu-cheng Li @Override 4016ca94d73bfe07f280e381595709b56c2681b2bcWu-cheng Li protected void onMeasure(int widthSpec, int heightSpec) { 4116ca94d73bfe07f280e381595709b56c2681b2bcWu-cheng Li int widthSpecSize = MeasureSpec.getSize(widthSpec); 4216ca94d73bfe07f280e381595709b56c2681b2bcWu-cheng Li int heightSpecSize = MeasureSpec.getSize(heightSpec); 434c7b291018e08dbb4bc1712d95117a294fa1416cWu-cheng Li int measuredSize = 0; 44d33109730e0ab81230f84e2bd35599e8e24fc4baChung-yih Wang int mode, longSideSize, shortSideSize, specSize; 4516ca94d73bfe07f280e381595709b56c2681b2bcWu-cheng Li 464c7b291018e08dbb4bc1712d95117a294fa1416cWu-cheng Li boolean isLandscape = (((Activity) getContext()).getRequestedOrientation() 474c7b291018e08dbb4bc1712d95117a294fa1416cWu-cheng Li == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 484c7b291018e08dbb4bc1712d95117a294fa1416cWu-cheng Li 494c7b291018e08dbb4bc1712d95117a294fa1416cWu-cheng Li if (isLandscape) { 504c7b291018e08dbb4bc1712d95117a294fa1416cWu-cheng Li mode = MeasureSpec.getMode(widthSpec); 514c7b291018e08dbb4bc1712d95117a294fa1416cWu-cheng Li longSideSize = widthSpecSize; 524c7b291018e08dbb4bc1712d95117a294fa1416cWu-cheng Li shortSideSize = heightSpecSize; 534c7b291018e08dbb4bc1712d95117a294fa1416cWu-cheng Li specSize = widthSpecSize; 544c7b291018e08dbb4bc1712d95117a294fa1416cWu-cheng Li } else { 554c7b291018e08dbb4bc1712d95117a294fa1416cWu-cheng Li mode = MeasureSpec.getMode(heightSpec); 564c7b291018e08dbb4bc1712d95117a294fa1416cWu-cheng Li longSideSize = heightSpecSize; 574c7b291018e08dbb4bc1712d95117a294fa1416cWu-cheng Li shortSideSize = widthSpecSize; 584c7b291018e08dbb4bc1712d95117a294fa1416cWu-cheng Li specSize = heightSpecSize; 594c7b291018e08dbb4bc1712d95117a294fa1416cWu-cheng Li } 604c7b291018e08dbb4bc1712d95117a294fa1416cWu-cheng Li 614c7b291018e08dbb4bc1712d95117a294fa1416cWu-cheng Li if (widthSpecSize > 0 && heightSpecSize > 0 && mode == MeasureSpec.AT_MOST) { 6216ca94d73bfe07f280e381595709b56c2681b2bcWu-cheng Li // Calculate how big 4:3 preview occupies. Then deduct it from the 6316ca94d73bfe07f280e381595709b56c2681b2bcWu-cheng Li // width of the parent. 644c7b291018e08dbb4bc1712d95117a294fa1416cWu-cheng Li measuredSize = (int) (longSideSize - shortSideSize / 3.0 * 4.0); 6516ca94d73bfe07f280e381595709b56c2681b2bcWu-cheng Li } else { 664c7b291018e08dbb4bc1712d95117a294fa1416cWu-cheng Li Log.e(TAG, "layout_xxx of ControlPanelLayout should be wrap_content"); 6716ca94d73bfe07f280e381595709b56c2681b2bcWu-cheng Li } 6816ca94d73bfe07f280e381595709b56c2681b2bcWu-cheng Li 69a96fbc672886ddac5169a7e8ddbfecf535770669akahuang // The size cannot be smaller than minimum constraint. 70a96fbc672886ddac5169a7e8ddbfecf535770669akahuang int minimumSize = (isLandscape) ? getMinimumWidth() : getMinimumHeight(); 71a96fbc672886ddac5169a7e8ddbfecf535770669akahuang if (measuredSize < minimumSize) { 72a96fbc672886ddac5169a7e8ddbfecf535770669akahuang measuredSize = minimumSize; 73a96fbc672886ddac5169a7e8ddbfecf535770669akahuang } 74a96fbc672886ddac5169a7e8ddbfecf535770669akahuang 75a96fbc672886ddac5169a7e8ddbfecf535770669akahuang // The size cannot be bigger than the constraint. 764c7b291018e08dbb4bc1712d95117a294fa1416cWu-cheng Li if (mode == MeasureSpec.AT_MOST && measuredSize > specSize) { 774c7b291018e08dbb4bc1712d95117a294fa1416cWu-cheng Li measuredSize = specSize; 784c7b291018e08dbb4bc1712d95117a294fa1416cWu-cheng Li } 794c7b291018e08dbb4bc1712d95117a294fa1416cWu-cheng Li 804c7b291018e08dbb4bc1712d95117a294fa1416cWu-cheng Li if (isLandscape) { 814c7b291018e08dbb4bc1712d95117a294fa1416cWu-cheng Li widthSpec = MeasureSpec.makeMeasureSpec(measuredSize, MeasureSpec.EXACTLY); 824c7b291018e08dbb4bc1712d95117a294fa1416cWu-cheng Li } else { 834c7b291018e08dbb4bc1712d95117a294fa1416cWu-cheng Li heightSpec = MeasureSpec.makeMeasureSpec(measuredSize, MeasureSpec.EXACTLY); 8416ca94d73bfe07f280e381595709b56c2681b2bcWu-cheng Li } 8516ca94d73bfe07f280e381595709b56c2681b2bcWu-cheng Li 864c7b291018e08dbb4bc1712d95117a294fa1416cWu-cheng Li super.onMeasure(widthSpec, heightSpec); 8716ca94d73bfe07f280e381595709b56c2681b2bcWu-cheng Li } 8816ca94d73bfe07f280e381595709b56c2681b2bcWu-cheng Li} 89