1db8f97582d09cd36eee8cfe4ed43182bff63f8bdDoris Liu/*
2db8f97582d09cd36eee8cfe4ed43182bff63f8bdDoris Liu * Copyright (C) 2014 The Android Open Source Project
3db8f97582d09cd36eee8cfe4ed43182bff63f8bdDoris Liu *
4db8f97582d09cd36eee8cfe4ed43182bff63f8bdDoris Liu * Licensed under the Apache License, Version 2.0 (the "License");
5db8f97582d09cd36eee8cfe4ed43182bff63f8bdDoris Liu * you may not use this file except in compliance with the License.
6db8f97582d09cd36eee8cfe4ed43182bff63f8bdDoris Liu * You may obtain a copy of the License at
7db8f97582d09cd36eee8cfe4ed43182bff63f8bdDoris Liu *
8db8f97582d09cd36eee8cfe4ed43182bff63f8bdDoris Liu *      http://www.apache.org/licenses/LICENSE-2.0
9db8f97582d09cd36eee8cfe4ed43182bff63f8bdDoris Liu *
10db8f97582d09cd36eee8cfe4ed43182bff63f8bdDoris Liu * Unless required by applicable law or agreed to in writing, software
11db8f97582d09cd36eee8cfe4ed43182bff63f8bdDoris Liu * distributed under the License is distributed on an "AS IS" BASIS,
12db8f97582d09cd36eee8cfe4ed43182bff63f8bdDoris Liu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13db8f97582d09cd36eee8cfe4ed43182bff63f8bdDoris Liu * See the License for the specific language governing permissions and
14db8f97582d09cd36eee8cfe4ed43182bff63f8bdDoris Liu * limitations under the License.
15db8f97582d09cd36eee8cfe4ed43182bff63f8bdDoris Liu */
16db8f97582d09cd36eee8cfe4ed43182bff63f8bdDoris Liu
17db8f97582d09cd36eee8cfe4ed43182bff63f8bdDoris Liupackage com.android.camera.widget;
18db8f97582d09cd36eee8cfe4ed43182bff63f8bdDoris Liu
19db8f97582d09cd36eee8cfe4ed43182bff63f8bdDoris Liuimport android.content.Context;
20db8f97582d09cd36eee8cfe4ed43182bff63f8bdDoris Liuimport android.content.res.Configuration;
21db8f97582d09cd36eee8cfe4ed43182bff63f8bdDoris Liuimport android.view.View;
22db8f97582d09cd36eee8cfe4ed43182bff63f8bdDoris Liuimport android.widget.FrameLayout;
23db8f97582d09cd36eee8cfe4ed43182bff63f8bdDoris Liu
242272f8a6bfc8adca8ada7a215bef038d45256085Senpo Huimport com.android.camera.exif.Rational;
252272f8a6bfc8adca8ada7a215bef038d45256085Senpo Huimport com.android.camera.settings.ResolutionUtil;
26db8f97582d09cd36eee8cfe4ed43182bff63f8bdDoris Liuimport com.android.camera2.R;
27db8f97582d09cd36eee8cfe4ed43182bff63f8bdDoris Liu
282272f8a6bfc8adca8ada7a215bef038d45256085Senpo Hu/**
292272f8a6bfc8adca8ada7a215bef038d45256085Senpo Hu * Displays a dialog that allows people to choose aspect ratio. Please
302272f8a6bfc8adca8ada7a215bef038d45256085Senpo Hu * instantiate this class programmatically.
312272f8a6bfc8adca8ada7a215bef038d45256085Senpo Hu */
32db8f97582d09cd36eee8cfe4ed43182bff63f8bdDoris Liupublic class AspectRatioDialogLayout extends FrameLayout {
332272f8a6bfc8adca8ada7a215bef038d45256085Senpo Hu
342272f8a6bfc8adca8ada7a215bef038d45256085Senpo Hu    private AspectRatioDialogListener mListener;
352272f8a6bfc8adca8ada7a215bef038d45256085Senpo Hu
362272f8a6bfc8adca8ada7a215bef038d45256085Senpo Hu    private View mAspectRatio4x3Button;
372272f8a6bfc8adca8ada7a215bef038d45256085Senpo Hu    private View mAspectRatio16x9Button;
38db8f97582d09cd36eee8cfe4ed43182bff63f8bdDoris Liu    private View mConfirmButton;
392272f8a6bfc8adca8ada7a215bef038d45256085Senpo Hu
402272f8a6bfc8adca8ada7a215bef038d45256085Senpo Hu    private Rational mAspectRatio;
41db8f97582d09cd36eee8cfe4ed43182bff63f8bdDoris Liu    private int mLastOrientation;
42db8f97582d09cd36eee8cfe4ed43182bff63f8bdDoris Liu
432272f8a6bfc8adca8ada7a215bef038d45256085Senpo Hu    /**
442272f8a6bfc8adca8ada7a215bef038d45256085Senpo Hu     * Constructs a new AspectRatioDialogLayout object.
452272f8a6bfc8adca8ada7a215bef038d45256085Senpo Hu     *
462272f8a6bfc8adca8ada7a215bef038d45256085Senpo Hu     * @param context The application context.
472272f8a6bfc8adca8ada7a215bef038d45256085Senpo Hu     * @param defaultAspectRatio The default aspect ratio to choose.
482272f8a6bfc8adca8ada7a215bef038d45256085Senpo Hu     */
492272f8a6bfc8adca8ada7a215bef038d45256085Senpo Hu    public AspectRatioDialogLayout(Context context, Rational defaultAspectRatio) {
502272f8a6bfc8adca8ada7a215bef038d45256085Senpo Hu        super(context);
512272f8a6bfc8adca8ada7a215bef038d45256085Senpo Hu        mAspectRatio = defaultAspectRatio;
522272f8a6bfc8adca8ada7a215bef038d45256085Senpo Hu        mLastOrientation = context.getResources().getConfiguration().orientation;
532272f8a6bfc8adca8ada7a215bef038d45256085Senpo Hu        setBackgroundResource(R.color.fullscreen_dialog_background_color);
542272f8a6bfc8adca8ada7a215bef038d45256085Senpo Hu        inflate(context, R.layout.aspect_ratio_dialog_content, this);
552272f8a6bfc8adca8ada7a215bef038d45256085Senpo Hu        updateSubviewReferences();
56db8f97582d09cd36eee8cfe4ed43182bff63f8bdDoris Liu    }
57db8f97582d09cd36eee8cfe4ed43182bff63f8bdDoris Liu
582272f8a6bfc8adca8ada7a215bef038d45256085Senpo Hu    public void setListener(AspectRatioDialogListener listener) {
592272f8a6bfc8adca8ada7a215bef038d45256085Senpo Hu        mListener = listener;
60db8f97582d09cd36eee8cfe4ed43182bff63f8bdDoris Liu    }
61db8f97582d09cd36eee8cfe4ed43182bff63f8bdDoris Liu
62db8f97582d09cd36eee8cfe4ed43182bff63f8bdDoris Liu    @Override
632272f8a6bfc8adca8ada7a215bef038d45256085Senpo Hu    public void onConfigurationChanged(Configuration config) {
642272f8a6bfc8adca8ada7a215bef038d45256085Senpo Hu        super.onConfigurationChanged(config);
652272f8a6bfc8adca8ada7a215bef038d45256085Senpo Hu
662272f8a6bfc8adca8ada7a215bef038d45256085Senpo Hu        if (config.orientation == mLastOrientation) {
672272f8a6bfc8adca8ada7a215bef038d45256085Senpo Hu            return;
682272f8a6bfc8adca8ada7a215bef038d45256085Senpo Hu        }
692272f8a6bfc8adca8ada7a215bef038d45256085Senpo Hu        mLastOrientation = config.orientation;
702272f8a6bfc8adca8ada7a215bef038d45256085Senpo Hu
712272f8a6bfc8adca8ada7a215bef038d45256085Senpo Hu        removeAllViews();
722272f8a6bfc8adca8ada7a215bef038d45256085Senpo Hu        inflate(getContext(), R.layout.aspect_ratio_dialog_content, this);
732272f8a6bfc8adca8ada7a215bef038d45256085Senpo Hu        updateSubviewReferences();
74db8f97582d09cd36eee8cfe4ed43182bff63f8bdDoris Liu    }
75db8f97582d09cd36eee8cfe4ed43182bff63f8bdDoris Liu
762272f8a6bfc8adca8ada7a215bef038d45256085Senpo Hu    private void updateSubviewReferences() {
772272f8a6bfc8adca8ada7a215bef038d45256085Senpo Hu        mAspectRatio4x3Button = findViewById(R.id.aspect_ratio_4x3_button);
782272f8a6bfc8adca8ada7a215bef038d45256085Senpo Hu        mAspectRatio16x9Button = findViewById(R.id.aspect_ratio_16x9_button);
79db8f97582d09cd36eee8cfe4ed43182bff63f8bdDoris Liu        mConfirmButton = findViewById(R.id.confirm_button);
802272f8a6bfc8adca8ada7a215bef038d45256085Senpo Hu
812272f8a6bfc8adca8ada7a215bef038d45256085Senpo Hu        // Set aspect ratio after references to views are established.
822272f8a6bfc8adca8ada7a215bef038d45256085Senpo Hu        setAspectRatio(mAspectRatio);
832272f8a6bfc8adca8ada7a215bef038d45256085Senpo Hu
842272f8a6bfc8adca8ada7a215bef038d45256085Senpo Hu        // Hook onclick events.
852272f8a6bfc8adca8ada7a215bef038d45256085Senpo Hu        mAspectRatio4x3Button.setOnClickListener(new OnClickListener() {
862272f8a6bfc8adca8ada7a215bef038d45256085Senpo Hu            @Override
872272f8a6bfc8adca8ada7a215bef038d45256085Senpo Hu            public void onClick(View v) {
882272f8a6bfc8adca8ada7a215bef038d45256085Senpo Hu                setAspectRatio(ResolutionUtil.ASPECT_RATIO_4x3);
892272f8a6bfc8adca8ada7a215bef038d45256085Senpo Hu            }
902272f8a6bfc8adca8ada7a215bef038d45256085Senpo Hu        });
912272f8a6bfc8adca8ada7a215bef038d45256085Senpo Hu        mAspectRatio16x9Button.setOnClickListener(new OnClickListener() {
922272f8a6bfc8adca8ada7a215bef038d45256085Senpo Hu            @Override
932272f8a6bfc8adca8ada7a215bef038d45256085Senpo Hu            public void onClick(View v) {
942272f8a6bfc8adca8ada7a215bef038d45256085Senpo Hu                setAspectRatio(ResolutionUtil.ASPECT_RATIO_16x9);
952272f8a6bfc8adca8ada7a215bef038d45256085Senpo Hu            }
962272f8a6bfc8adca8ada7a215bef038d45256085Senpo Hu        });
97db8f97582d09cd36eee8cfe4ed43182bff63f8bdDoris Liu        mConfirmButton.setOnClickListener(new OnClickListener() {
98db8f97582d09cd36eee8cfe4ed43182bff63f8bdDoris Liu            @Override
99db8f97582d09cd36eee8cfe4ed43182bff63f8bdDoris Liu            public void onClick(View v) {
100db8f97582d09cd36eee8cfe4ed43182bff63f8bdDoris Liu                if (mListener != null) {
1012272f8a6bfc8adca8ada7a215bef038d45256085Senpo Hu                    mListener.onConfirm(mAspectRatio);
102db8f97582d09cd36eee8cfe4ed43182bff63f8bdDoris Liu                }
103db8f97582d09cd36eee8cfe4ed43182bff63f8bdDoris Liu            }
104db8f97582d09cd36eee8cfe4ed43182bff63f8bdDoris Liu        });
105db8f97582d09cd36eee8cfe4ed43182bff63f8bdDoris Liu    }
106db8f97582d09cd36eee8cfe4ed43182bff63f8bdDoris Liu
1072272f8a6bfc8adca8ada7a215bef038d45256085Senpo Hu    private void setAspectRatio(Rational aspectRatio) {
1082272f8a6bfc8adca8ada7a215bef038d45256085Senpo Hu        mAspectRatio = aspectRatio;
109db8f97582d09cd36eee8cfe4ed43182bff63f8bdDoris Liu
1102272f8a6bfc8adca8ada7a215bef038d45256085Senpo Hu        if (mAspectRatio.equals(ResolutionUtil.ASPECT_RATIO_4x3)) {
1112272f8a6bfc8adca8ada7a215bef038d45256085Senpo Hu            // Select 4x3 view and unselect 16x9 view.
1122272f8a6bfc8adca8ada7a215bef038d45256085Senpo Hu            mAspectRatio4x3Button.setSelected(true);
1132272f8a6bfc8adca8ada7a215bef038d45256085Senpo Hu            mAspectRatio16x9Button.setSelected(false);
1142272f8a6bfc8adca8ada7a215bef038d45256085Senpo Hu        } else if (mAspectRatio.equals(ResolutionUtil.ASPECT_RATIO_16x9)) {
1152272f8a6bfc8adca8ada7a215bef038d45256085Senpo Hu            // Select 16x9 view and unselect 4x3 view.
1162272f8a6bfc8adca8ada7a215bef038d45256085Senpo Hu            mAspectRatio16x9Button.setSelected(true);
1172272f8a6bfc8adca8ada7a215bef038d45256085Senpo Hu            mAspectRatio4x3Button.setSelected(false);
1182272f8a6bfc8adca8ada7a215bef038d45256085Senpo Hu        }
119db8f97582d09cd36eee8cfe4ed43182bff63f8bdDoris Liu    }
120db8f97582d09cd36eee8cfe4ed43182bff63f8bdDoris Liu
1212272f8a6bfc8adca8ada7a215bef038d45256085Senpo Hu    public interface AspectRatioDialogListener {
1222272f8a6bfc8adca8ada7a215bef038d45256085Senpo Hu        public void onConfirm(Rational chosenAspectRatio);
123db8f97582d09cd36eee8cfe4ed43182bff63f8bdDoris Liu    }
124db8f97582d09cd36eee8cfe4ed43182bff63f8bdDoris Liu}
125