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