1ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi/* 2ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * Copyright (C) 2010 The Android Open Source Project 3ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * 4ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * Licensed under the Apache License, Version 2.0 (the "License"); 5ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * you may not use this file except in compliance with the License. 6ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * You may obtain a copy of the License at 7ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * 8ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * http://www.apache.org/licenses/LICENSE-2.0 9ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * 10ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * Unless required by applicable law or agreed to in writing, software 11ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * distributed under the License is distributed on an "AS IS" BASIS, 12ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * See the License for the specific language governing permissions and 14ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * limitations under the License. 15ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi */ 16ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 1781393d6dc5767f7784a00958095614a37bf1a91aGil Dobjanschipackage com.android.videoeditor; 18ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 19ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.app.AlertDialog; 20ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.app.Dialog; 21ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.content.Context; 22ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.content.DialogInterface; 23ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.media.videoeditor.MediaProperties; 24ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.util.Pair; 25ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.view.LayoutInflater; 26ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.view.View; 27ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.widget.ArrayAdapter; 28ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschiimport android.widget.Spinner; 29ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 30ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi/** 31ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * The export options dialog 32ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi */ 33ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschipublic class ExportOptionsDialog { 34ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi // Listener 35ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi public interface ExportOptionsListener { 36ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi /** 37ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * User initiated the export operation 38ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * 39ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * @param movieHeight The movie height (from MediaProperties) 40ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * @param movieBitrate The movie bitrate (from MediaProperties) 41ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi */ 42ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi public void onExportOptions(int movieHeight, int movieBitrate); 43ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 44ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 45ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi /** 46ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * Create the export options dialog 47ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * 48ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * @param context The context 49ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * @param positiveListener The positive listener 50ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * @param negativeListener The negative listener 51ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * @param cancelListener The cancel listener 52ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * @param aspectRatio The aspect ratio 53ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * 54ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * @return The dialog 55ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi */ 56ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi public static Dialog create(Context context, final ExportOptionsListener positiveListener, 57ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi DialogInterface.OnClickListener negativeListener, 58ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi DialogInterface.OnCancelListener cancelListener, final int aspectRatio) { 59ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi AlertDialog.Builder builder = new AlertDialog.Builder(context); 60ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 61ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi // Set the title 62ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi builder.setIcon(android.R.drawable.ic_dialog_info); 63ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi builder.setTitle(context.getString(R.string.editor_export_movie)); 64ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 65ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi // Set the layout 66ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final LayoutInflater vi = (LayoutInflater)context 67ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 68ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final View myView = vi.inflate(R.layout.export_options_dialog_view, null); 69ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi builder.setView(myView); 70ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 71ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi // Prepare the dialog content 72ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi prepareContent(myView, aspectRatio); 73ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 74ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi // Setup the positive listener 75ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi builder.setPositiveButton(context.getString(R.string.export_dialog_export), 76ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi new DialogInterface.OnClickListener() { 772cf647324622315db4b77cb7d637a5b0a516dce4Shih-chia Cheng @Override 78ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi public void onClick(DialogInterface dialog, int which) { 79ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final Spinner sizeSpinner = (Spinner)myView.findViewById( 80ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi R.id.export_option_size); 81ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final int movieHeight = indexToMovieHeight( 82ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi sizeSpinner.getSelectedItemPosition(), aspectRatio); 83ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final Spinner qualitySpinner = (Spinner)myView.findViewById( 84ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi R.id.export_option_quality); 85ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final int movieBitrate = indexToMovieBitrate( 86ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi qualitySpinner.getSelectedItemPosition()); 87ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi positiveListener.onExportOptions(movieHeight, movieBitrate); 88ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 89ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi }); 90ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 91ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi // Setup the negative listener 92ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi builder.setNegativeButton(context.getString(android.R.string.cancel), negativeListener); 93ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 94ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi builder.setCancelable(true); 95ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi builder.setOnCancelListener(cancelListener); 96ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 97acb912709027b1c47fa3fa371e3aa68efd61501cGil Dobjanschi final AlertDialog dialog = builder.create(); 982cf647324622315db4b77cb7d637a5b0a516dce4Shih-chia Cheng 99acb912709027b1c47fa3fa371e3aa68efd61501cGil Dobjanschi return dialog; 100ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 101ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 102ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi /** 103ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * Prepare the dialog content 104ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * 105ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * @param view The dialog content view 106ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * @param aspectRatio The project aspect ratio 107ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi */ 108ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi private static void prepareContent(View view, int aspectRatio) { 109ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final Context context = view.getContext(); 110ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi // Setup the movie size spinner 111ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final ArrayAdapter<CharSequence> sizeAdapter = new ArrayAdapter<CharSequence>( 112ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi context, android.R.layout.simple_spinner_item); 113ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi sizeAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 114ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final Pair<Integer, Integer>[] supportedSizes = 115ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi MediaProperties.getSupportedResolutions(aspectRatio); 116ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi for (int i = 0; i < supportedSizes.length; i++) { 117ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi sizeAdapter.add(supportedSizes[i].first + "x" + supportedSizes[i].second); 118ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 119ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final Spinner sizeSpinner = (Spinner)view.findViewById(R.id.export_option_size); 120ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi sizeSpinner.setAdapter(sizeAdapter); 121ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi sizeSpinner.setPromptId(R.string.export_dialog_movie_size); 122ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 123ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi // Setup the movie quality spinner 124ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final ArrayAdapter<CharSequence> qualityAdapter = new ArrayAdapter<CharSequence>(context, 125ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi android.R.layout.simple_spinner_item); 126ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi qualityAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 127ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi qualityAdapter.add(context.getString(R.string.export_dialog_movie_quality_low)); 128ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi qualityAdapter.add(context.getString(R.string.export_dialog_movie_quality_medium)); 129ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi qualityAdapter.add(context.getString(R.string.export_dialog_movie_quality_high)); 130ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final Spinner qualitySpinner = (Spinner)view.findViewById(R.id.export_option_quality); 131ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi qualitySpinner.setAdapter(qualityAdapter); 132ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi // Set the default quality to "Medium" 133ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi qualitySpinner.setSelection(1); 134ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi qualitySpinner.setPromptId(R.string.export_dialog_movie_quality); 135ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 136ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 137ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi /** 138ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * Convert the spinner selection to a movie height 139ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * 140ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * @param sizeIndex The index of the selected spinner item 141ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * @param aspectRatio The aspect ratio 142ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * 143ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * @return The movie height 144ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi */ 145ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi private static int indexToMovieHeight(int sizeIndex, int aspectRatio) { 146ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi final Pair<Integer, Integer>[] supportedSizes = 147ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi MediaProperties.getSupportedResolutions(aspectRatio); 148ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi return supportedSizes[sizeIndex].second; 149ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 150ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 151ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi /** 152ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * Convert the spinner selection to a movie quality 153ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * 154ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * @param qualityIndex The index of the selected spinner item 155ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * 156ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi * @return The movie bitrate 157ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi */ 158ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi private static int indexToMovieBitrate(int qualityIndex) { 159ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi switch (qualityIndex) { 160ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi case 0: { // Low 161ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi return MediaProperties.BITRATE_512K; 162ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 163ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 164ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi case 1: { // Medium 165ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi return MediaProperties.BITRATE_2M; 166ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 167ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 168ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi case 2: { // High 169ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi return MediaProperties.BITRATE_8M; 170ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 171ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi 172ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi default: { 173ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi return MediaProperties.BITRATE_2M; 174ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 175ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 176ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi } 177ace3cdb462fef9563a0470223c62a7e80e6d587aGil Dobjanschi} 178