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